summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Gardiner <paulg.artifex@glidos.net>2013-02-25 15:29:07 +0000
committerRobin Watts <robin.watts@artifex.com>2013-02-26 19:02:02 +0000
commit08dd51d661b7e1adf925a667a548755fadbfbef7 (patch)
tree4626edb1aa0b1f9df728183cc5029e2be6e78fca
parent5bf497485a597a866bb5c149ef02f2b10b74e1ea (diff)
downloadmupdf-08dd51d661b7e1adf925a667a548755fadbfbef7.tar.xz
Android: add support for highlight and underline markup annotations.
Highlight annotations currently come out opaque so aren't a lot of use.
-rw-r--r--android/jni/mupdf.c54
-rw-r--r--android/res/drawable-ldpi/ic_highlight.pngbin0 -> 378 bytes
-rw-r--r--android/res/drawable-ldpi/ic_strike.pngbin440 -> 449 bytes
-rw-r--r--android/res/drawable-ldpi/ic_underline.pngbin0 -> 403 bytes
-rw-r--r--android/res/drawable-mdpi/ic_highlight.pngbin0 -> 524 bytes
-rw-r--r--android/res/drawable-mdpi/ic_strike.pngbin589 -> 622 bytes
-rw-r--r--android/res/drawable-mdpi/ic_underline.pngbin0 -> 565 bytes
-rw-r--r--android/res/layout/buttons.xml20
-rw-r--r--android/res/values/strings.xml2
-rw-r--r--android/src/com/artifex/mupdfdemo/MuPDFActivity.java28
-rw-r--r--android/src/com/artifex/mupdfdemo/MuPDFCore.java6
-rw-r--r--android/src/com/artifex/mupdfdemo/MuPDFPageView.java8
-rw-r--r--android/src/com/artifex/mupdfdemo/MuPDFReflowView.java2
-rw-r--r--android/src/com/artifex/mupdfdemo/MuPDFView.java2
-rw-r--r--android/src/com/artifex/mupdfdemo/PageView.java2
15 files changed, 103 insertions, 21 deletions
diff --git a/android/jni/mupdf.c b/android/jni/mupdf.c
index f5abf328..26af9149 100644
--- a/android/jni/mupdf.c
+++ b/android/jni/mupdf.c
@@ -33,6 +33,7 @@
#define MAX_SEARCH_HITS (500)
#define NUM_CACHE (3)
#define STRIKE_HEIGHT (0.375f)
+#define UNDERLINE_HEIGHT (0.075f)
#define LINE_THICKNESS (0.07f)
#define SMALL_FLOAT (0.00001)
@@ -1363,7 +1364,7 @@ JNI_FN(MuPDFCore_textAsHtml)(JNIEnv * env, jobject thiz)
}
JNIEXPORT void JNICALL
-JNI_FN(MuPDFCore_addStrikeOutAnnotationInternal)(JNIEnv * env, jobject thiz, jobjectArray points)
+JNI_FN(MuPDFCore_addMarkupAnnotationInternal)(JNIEnv * env, jobject thiz, jobjectArray points, fz_annot_type type)
{
globals *glo = get_globals(env, thiz);
fz_context *ctx = glo->ctx;
@@ -1378,10 +1379,44 @@ JNI_FN(MuPDFCore_addStrikeOutAnnotationInternal)(JNIEnv * env, jobject thiz, job
fz_stroke_state *stroke = NULL;
fz_device *dev = NULL;
fz_display_list *strike_list;
+ float color[3];
+ float alpha;
+ float line_height;
+ float line_thickness;
if (idoc == NULL)
return;
+ switch (type)
+ {
+ case FZ_ANNOT_HIGHLIGHT:
+ color[0] = 1.0;
+ color[1] = 1.0;
+ color[2] = 0.0;
+ alpha = 0.5;
+ line_thickness = 1.0;
+ line_height = 0.5;
+ break;
+ case FZ_ANNOT_UNDERLINE:
+ color[0] = 0.0;
+ color[1] = 0.0;
+ color[2] = 1.0;
+ alpha = 1.0;
+ line_thickness = LINE_THICKNESS;
+ line_height = UNDERLINE_HEIGHT;
+ break;
+ case FZ_ANNOT_STRIKEOUT:
+ color[0] = 1.0;
+ color[1] = 0.0;
+ color[2] = 0.0;
+ alpha = 1.0;
+ line_thickness = LINE_THICKNESS;
+ line_height = STRIKE_HEIGHT;
+ break;
+ default:
+ return;
+ }
+
strike_list = fz_new_display_list(ctx);
fz_var(pts);
@@ -1393,7 +1428,6 @@ JNI_FN(MuPDFCore_addStrikeOutAnnotationInternal)(JNIEnv * env, jobject thiz, job
fz_annot *annot;
fz_matrix ctm;
- float color[3] = {1.0, 0.0, 0.0};
float zoom = glo->resolution / 72;
zoom = 1.0 / zoom;
fz_scale(&ctm, zoom, zoom);
@@ -1417,7 +1451,7 @@ JNI_FN(MuPDFCore_addStrikeOutAnnotationInternal)(JNIEnv * env, jobject thiz, job
pts[i].y = opt ? (*env)->GetFloatField(env, opt, y_fid) : 0.0f;
}
- annot = fz_create_annot(idoc, pc->page, FZ_ANNOT_STRIKEOUT);
+ annot = fz_create_annot(idoc, pc->page, type);
fz_set_markup_annot_quadpoints(idoc, annot, pts, n);
@@ -1431,19 +1465,19 @@ JNI_FN(MuPDFCore_addStrikeOutAnnotationInternal)(JNIEnv * env, jobject thiz, job
up.x = pts[i+2].x - pts[i+1].x;
up.y = pts[i+2].y - pts[i+1].y;
- pt0.x += STRIKE_HEIGHT * up.x;
- pt0.y += STRIKE_HEIGHT * up.y;
- pt1.x += STRIKE_HEIGHT * up.x;
- pt1.y += STRIKE_HEIGHT * up.y;
+ pt0.x += line_height * up.x;
+ pt0.y += line_height * up.y;
+ pt1.x += line_height * up.x;
+ pt1.y += line_height * up.y;
- thickness = sqrtf(up.x * up.x + up.y * up.y) * LINE_THICKNESS;
+ thickness = sqrtf(up.x * up.x + up.y * up.y) * line_thickness;
if (!stroke || fz_abs(stroke->linewidth - thickness) < SMALL_FLOAT)
{
if (stroke)
{
// assert(path)
- fz_stroke_path(dev, path, stroke, &ctm, fz_device_rgb, color, 1.0);
+ fz_stroke_path(dev, path, stroke, &ctm, fz_device_rgb, color, alpha);
fz_drop_stroke_state(ctx, stroke);
stroke = NULL;
fz_free_path(ctx, path);
@@ -1461,7 +1495,7 @@ JNI_FN(MuPDFCore_addStrikeOutAnnotationInternal)(JNIEnv * env, jobject thiz, job
if (stroke)
{
- fz_stroke_path(dev, path, stroke, &ctm, fz_device_rgb, color, 1.0);
+ fz_stroke_path(dev, path, stroke, &ctm, fz_device_rgb, color, alpha);
}
fz_set_annot_appearance(idoc, annot, strike_list);
diff --git a/android/res/drawable-ldpi/ic_highlight.png b/android/res/drawable-ldpi/ic_highlight.png
new file mode 100644
index 00000000..3d6d29b9
--- /dev/null
+++ b/android/res/drawable-ldpi/ic_highlight.png
Binary files differ
diff --git a/android/res/drawable-ldpi/ic_strike.png b/android/res/drawable-ldpi/ic_strike.png
index 36ebe0f3..fc39409f 100644
--- a/android/res/drawable-ldpi/ic_strike.png
+++ b/android/res/drawable-ldpi/ic_strike.png
Binary files differ
diff --git a/android/res/drawable-ldpi/ic_underline.png b/android/res/drawable-ldpi/ic_underline.png
new file mode 100644
index 00000000..0a5be3d4
--- /dev/null
+++ b/android/res/drawable-ldpi/ic_underline.png
Binary files differ
diff --git a/android/res/drawable-mdpi/ic_highlight.png b/android/res/drawable-mdpi/ic_highlight.png
new file mode 100644
index 00000000..2a8fe4db
--- /dev/null
+++ b/android/res/drawable-mdpi/ic_highlight.png
Binary files differ
diff --git a/android/res/drawable-mdpi/ic_strike.png b/android/res/drawable-mdpi/ic_strike.png
index 9b2cf71a..b15e9324 100644
--- a/android/res/drawable-mdpi/ic_strike.png
+++ b/android/res/drawable-mdpi/ic_strike.png
Binary files differ
diff --git a/android/res/drawable-mdpi/ic_underline.png b/android/res/drawable-mdpi/ic_underline.png
new file mode 100644
index 00000000..5d4dd5a4
--- /dev/null
+++ b/android/res/drawable-mdpi/ic_underline.png
Binary files differ
diff --git a/android/res/layout/buttons.xml b/android/res/layout/buttons.xml
index b89848bb..879abf46 100644
--- a/android/res/layout/buttons.xml
+++ b/android/res/layout/buttons.xml
@@ -149,6 +149,26 @@
android:src="@drawable/ic_cancel" />
<ImageButton
+ android:id="@+id/highlightButton"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_centerVertical="true"
+ android:layout_toLeftOf="@+id/underlineButton"
+ android:contentDescription="@string/highlight"
+ android:background="@drawable/button"
+ android:src="@drawable/ic_highlight" />
+
+ <ImageButton
+ android:id="@+id/underlineButton"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_centerVertical="true"
+ android:layout_toLeftOf="@+id/strikeOutButton"
+ android:contentDescription="@string/underline"
+ android:background="@drawable/button"
+ android:src="@drawable/ic_underline" />
+
+ <ImageButton
android:id="@+id/strikeOutButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
diff --git a/android/res/values/strings.xml b/android/res/values/strings.xml
index 47453fb3..9509c9db 100644
--- a/android/res/values/strings.xml
+++ b/android/res/values/strings.xml
@@ -22,4 +22,6 @@
<string name="copy">Copy</string>
<string name="strike_out">Strike out</string>
<string name="delete">Delete</string>
+ <string name="highlight">Highlight</string>
+ <string name="underline">Underline</string>
</resources>
diff --git a/android/src/com/artifex/mupdfdemo/MuPDFActivity.java b/android/src/com/artifex/mupdfdemo/MuPDFActivity.java
index 2e1b310c..4f10e991 100644
--- a/android/src/com/artifex/mupdfdemo/MuPDFActivity.java
+++ b/android/src/com/artifex/mupdfdemo/MuPDFActivity.java
@@ -62,6 +62,8 @@ public class MuPDFActivity extends Activity
private ImageButton mSelectButton;
private ImageButton mCancelSelectButton;
private ImageButton mCopySelectButton;
+ private ImageButton mHighlightButton;
+ private ImageButton mUnderlineButton;
private ImageButton mStrikeOutButton;
private ImageButton mCancelButton;
private ImageButton mOutlineButton;
@@ -527,11 +529,33 @@ public class MuPDFActivity extends Activity
}
});
+ mHighlightButton.setOnClickListener(new View.OnClickListener() {
+ public void onClick(View v) {
+ MuPDFView pageView = (MuPDFView) mDocView.getDisplayedView();
+ if (pageView != null)
+ pageView.markupSelection(Annotation.Type.HIGHLIGHT);
+ mDocView.setSelectionMode(false);
+ mTopBarMode = TopBarMode.Main;
+ mTopBarSwitcher.setDisplayedChild(mTopBarMode.ordinal());
+ }
+ });
+
+ mUnderlineButton.setOnClickListener(new View.OnClickListener() {
+ public void onClick(View v) {
+ MuPDFView pageView = (MuPDFView) mDocView.getDisplayedView();
+ if (pageView != null)
+ pageView.markupSelection(Annotation.Type.UNDERLINE);
+ mDocView.setSelectionMode(false);
+ mTopBarMode = TopBarMode.Main;
+ mTopBarSwitcher.setDisplayedChild(mTopBarMode.ordinal());
+ }
+ });
+
mStrikeOutButton.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
MuPDFView pageView = (MuPDFView) mDocView.getDisplayedView();
if (pageView != null)
- pageView.strikeOutSelection();
+ pageView.markupSelection(Annotation.Type.STRIKEOUT);
mDocView.setSelectionMode(false);
mTopBarMode = TopBarMode.Main;
mTopBarSwitcher.setDisplayedChild(mTopBarMode.ordinal());
@@ -852,6 +876,8 @@ public class MuPDFActivity extends Activity
mSelectButton = (ImageButton)mButtonsView.findViewById(R.id.selectButton);
mCancelSelectButton = (ImageButton)mButtonsView.findViewById(R.id.cancelSelectButton);
mCopySelectButton = (ImageButton)mButtonsView.findViewById(R.id.copySelectButton);
+ mHighlightButton = (ImageButton)mButtonsView.findViewById(R.id.highlightButton);
+ mUnderlineButton = (ImageButton)mButtonsView.findViewById(R.id.underlineButton);
mStrikeOutButton = (ImageButton)mButtonsView.findViewById(R.id.strikeOutButton);
mCancelButton = (ImageButton)mButtonsView.findViewById(R.id.cancel);
mOutlineButton = (ImageButton)mButtonsView.findViewById(R.id.outlineButton);
diff --git a/android/src/com/artifex/mupdfdemo/MuPDFCore.java b/android/src/com/artifex/mupdfdemo/MuPDFCore.java
index bfcb3582..424e3536 100644
--- a/android/src/com/artifex/mupdfdemo/MuPDFCore.java
+++ b/android/src/com/artifex/mupdfdemo/MuPDFCore.java
@@ -39,7 +39,7 @@ public class MuPDFCore
private native RectF[] searchPage(String text);
private native TextChar[][][][] text();
private native byte[] textAsHtml();
- private native void addStrikeOutAnnotationInternal(PointF[] quadPoints);
+ private native void addMarkupAnnotationInternal(PointF[] quadPoints, int type);
private native void deleteAnnotationInternal(int annot_index);
private native int passClickEventInternal(int page, float x, float y);
private native void setFocusedWidgetChoiceSelectedInternal(String [] selected);
@@ -248,9 +248,9 @@ public class MuPDFCore
return lns.toArray(new TextWord[lns.size()][]);
}
- public synchronized void addStrikeOutAnnotation(int page, PointF[] quadPoints) {
+ public synchronized void addMarkupAnnotation(int page, PointF[] quadPoints, Annotation.Type type) {
gotoPage(page);
- addStrikeOutAnnotationInternal(quadPoints);
+ addMarkupAnnotationInternal(quadPoints, type.ordinal());
}
public synchronized void deleteAnnotation(int page, int annot_index) {
diff --git a/android/src/com/artifex/mupdfdemo/MuPDFPageView.java b/android/src/com/artifex/mupdfdemo/MuPDFPageView.java
index d82b2d0a..092af33b 100644
--- a/android/src/com/artifex/mupdfdemo/MuPDFPageView.java
+++ b/android/src/com/artifex/mupdfdemo/MuPDFPageView.java
@@ -279,7 +279,7 @@ public class MuPDFPageView extends PageView implements MuPDFView {
return true;
}
- public void strikeOutSelection() {
+ public void markupSelection(final Annotation.Type type) {
final ArrayList<PointF> quadPoints = new ArrayList<PointF>();
processSelectedText(new TextProcessor() {
RectF rect;
@@ -305,7 +305,7 @@ public class MuPDFPageView extends PageView implements MuPDFView {
mAddStrikeOut = new AsyncTask<PointF[],Void,Void>() {
@Override
protected Void doInBackground(PointF[]... params) {
- addStrikeOut(params[0]);
+ addMarkup(params[0], type);
return null;
}
@@ -375,8 +375,8 @@ public class MuPDFPageView extends PageView implements MuPDFView {
}
@Override
- protected void addStrikeOut(PointF[] quadPoints) {
- mCore.addStrikeOutAnnotation(mPageNumber, quadPoints);
+ protected void addMarkup(PointF[] quadPoints, Annotation.Type type) {
+ mCore.addMarkupAnnotation(mPageNumber, quadPoints, type);
}
private void loadAnnotations() {
diff --git a/android/src/com/artifex/mupdfdemo/MuPDFReflowView.java b/android/src/com/artifex/mupdfdemo/MuPDFReflowView.java
index 0cc2960a..d21140f4 100644
--- a/android/src/com/artifex/mupdfdemo/MuPDFReflowView.java
+++ b/android/src/com/artifex/mupdfdemo/MuPDFReflowView.java
@@ -99,7 +99,7 @@ public class MuPDFReflowView extends WebView implements MuPDFView {
return false;
}
- public void strikeOutSelection() {
+ public void markupSelection(Annotation.Type type) {
}
public void setSearchBoxes(RectF[] searchBoxes) {
diff --git a/android/src/com/artifex/mupdfdemo/MuPDFView.java b/android/src/com/artifex/mupdfdemo/MuPDFView.java
index a213b349..fe93b532 100644
--- a/android/src/com/artifex/mupdfdemo/MuPDFView.java
+++ b/android/src/com/artifex/mupdfdemo/MuPDFView.java
@@ -15,7 +15,7 @@ public interface MuPDFView {
public void selectText(float x0, float y0, float x1, float y1);
public void deselectText();
public boolean copySelection();
- public void strikeOutSelection();
+ public void markupSelection(Annotation.Type type);
public void deleteSelectedAnnotation();
public void setSearchBoxes(RectF searchBoxes[]);
public void setLinkHighlighting(boolean f);
diff --git a/android/src/com/artifex/mupdfdemo/PageView.java b/android/src/com/artifex/mupdfdemo/PageView.java
index 2412253f..3eb1e5a3 100644
--- a/android/src/com/artifex/mupdfdemo/PageView.java
+++ b/android/src/com/artifex/mupdfdemo/PageView.java
@@ -146,7 +146,7 @@ public abstract class PageView extends ViewGroup {
protected abstract Bitmap updatePage(BitmapHolder h, int sizeX, int sizeY, int patchX, int patchY, int patchWidth, int patchHeight);
protected abstract LinkInfo[] getLinkInfo();
protected abstract TextWord[][] getText();
- protected abstract void addStrikeOut(PointF[] quadPoints);
+ protected abstract void addMarkup(PointF[] quadPoints, Annotation.Type type);
private void reinit() {
// Cancel pending render task