diff options
author | Paul Gardiner <paulg.artifex@glidos.net> | 2013-02-25 15:29:07 +0000 |
---|---|---|
committer | Robin Watts <robin.watts@artifex.com> | 2013-02-26 19:02:02 +0000 |
commit | 08dd51d661b7e1adf925a667a548755fadbfbef7 (patch) | |
tree | 4626edb1aa0b1f9df728183cc5029e2be6e78fca | |
parent | 5bf497485a597a866bb5c149ef02f2b10b74e1ea (diff) | |
download | mupdf-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.c | 54 | ||||
-rw-r--r-- | android/res/drawable-ldpi/ic_highlight.png | bin | 0 -> 378 bytes | |||
-rw-r--r-- | android/res/drawable-ldpi/ic_strike.png | bin | 440 -> 449 bytes | |||
-rw-r--r-- | android/res/drawable-ldpi/ic_underline.png | bin | 0 -> 403 bytes | |||
-rw-r--r-- | android/res/drawable-mdpi/ic_highlight.png | bin | 0 -> 524 bytes | |||
-rw-r--r-- | android/res/drawable-mdpi/ic_strike.png | bin | 589 -> 622 bytes | |||
-rw-r--r-- | android/res/drawable-mdpi/ic_underline.png | bin | 0 -> 565 bytes | |||
-rw-r--r-- | android/res/layout/buttons.xml | 20 | ||||
-rw-r--r-- | android/res/values/strings.xml | 2 | ||||
-rw-r--r-- | android/src/com/artifex/mupdfdemo/MuPDFActivity.java | 28 | ||||
-rw-r--r-- | android/src/com/artifex/mupdfdemo/MuPDFCore.java | 6 | ||||
-rw-r--r-- | android/src/com/artifex/mupdfdemo/MuPDFPageView.java | 8 | ||||
-rw-r--r-- | android/src/com/artifex/mupdfdemo/MuPDFReflowView.java | 2 | ||||
-rw-r--r-- | android/src/com/artifex/mupdfdemo/MuPDFView.java | 2 | ||||
-rw-r--r-- | android/src/com/artifex/mupdfdemo/PageView.java | 2 |
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 Binary files differnew file mode 100644 index 00000000..3d6d29b9 --- /dev/null +++ b/android/res/drawable-ldpi/ic_highlight.png diff --git a/android/res/drawable-ldpi/ic_strike.png b/android/res/drawable-ldpi/ic_strike.png Binary files differindex 36ebe0f3..fc39409f 100644 --- a/android/res/drawable-ldpi/ic_strike.png +++ b/android/res/drawable-ldpi/ic_strike.png diff --git a/android/res/drawable-ldpi/ic_underline.png b/android/res/drawable-ldpi/ic_underline.png Binary files differnew file mode 100644 index 00000000..0a5be3d4 --- /dev/null +++ b/android/res/drawable-ldpi/ic_underline.png diff --git a/android/res/drawable-mdpi/ic_highlight.png b/android/res/drawable-mdpi/ic_highlight.png Binary files differnew file mode 100644 index 00000000..2a8fe4db --- /dev/null +++ b/android/res/drawable-mdpi/ic_highlight.png diff --git a/android/res/drawable-mdpi/ic_strike.png b/android/res/drawable-mdpi/ic_strike.png Binary files differindex 9b2cf71a..b15e9324 100644 --- a/android/res/drawable-mdpi/ic_strike.png +++ b/android/res/drawable-mdpi/ic_strike.png diff --git a/android/res/drawable-mdpi/ic_underline.png b/android/res/drawable-mdpi/ic_underline.png Binary files differnew file mode 100644 index 00000000..5d4dd5a4 --- /dev/null +++ b/android/res/drawable-mdpi/ic_underline.png 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 |