summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Gardiner <paulg.artifex@glidos.net>2013-06-14 11:08:39 +0100
committerRobin Watts <robin.watts@artifex.com>2013-06-17 15:07:08 +0100
commitb695c87abcdbe0ddc35c5e3a7ee8f5f58ee577f1 (patch)
tree31a470c889c88540235d4f70b6e1334249b92fbe
parente860f7240878c22d90b086827e58e1e8e055bbf8 (diff)
downloadmupdf-b695c87abcdbe0ddc35c5e3a7ee8f5f58ee577f1.tar.xz
Tweaks to ink annotation for smoothness.
Patch from "andyhan2000" to make the ink annotations smoother.
-rw-r--r--android/src/com/artifex/mupdfdemo/MuPDFReaderView.java71
-rw-r--r--android/src/com/artifex/mupdfdemo/PageView.java20
-rw-r--r--pdf/pdf_annot.c5
3 files changed, 80 insertions, 16 deletions
diff --git a/android/src/com/artifex/mupdfdemo/MuPDFReaderView.java b/android/src/com/artifex/mupdfdemo/MuPDFReaderView.java
index 3a1b708a..9cab70b7 100644
--- a/android/src/com/artifex/mupdfdemo/MuPDFReaderView.java
+++ b/android/src/com/artifex/mupdfdemo/MuPDFReaderView.java
@@ -96,13 +96,7 @@ public class MuPDFReaderView extends ReaderView {
@Override
public boolean onDown(MotionEvent e) {
- switch (mMode) {
- case Drawing:
- MuPDFView pageView = (MuPDFView)getDisplayedView();
- if (pageView != null)
- pageView.startDraw(e.getX(), e.getY());
- break;
- }
+
return super.onDown(e);
}
@@ -119,10 +113,6 @@ public class MuPDFReaderView extends ReaderView {
if (pageView != null)
pageView.selectText(e1.getX(), e1.getY(), e2.getX(), e2.getY());
return true;
- case Drawing:
- if (pageView != null)
- pageView.continueDraw(e2.getX(), e2.getY());
- return true;
default:
return true;
}
@@ -148,12 +138,69 @@ public class MuPDFReaderView extends ReaderView {
}
public boolean onTouchEvent(MotionEvent event) {
- if ((event.getAction() & event.ACTION_MASK) == MotionEvent.ACTION_DOWN)
+
+ if ( mMode == Mode.Drawing )
+ {
+ float x = event.getX();
+ float y = event.getY();
+ switch (event.getAction())
+ {
+ case MotionEvent.ACTION_DOWN:
+ touch_start(x, y);
+ break;
+ case MotionEvent.ACTION_MOVE:
+ touch_move(x, y);
+ break;
+ case MotionEvent.ACTION_UP:
+ touch_up();
+ break;
+ }
+ }
+
+ if ((event.getAction() & event.getActionMasked()) == MotionEvent.ACTION_DOWN)
+ {
tapDisabled = false;
+ }
return super.onTouchEvent(event);
}
+ private float mX, mY;
+
+ private static final float TOUCH_TOLERANCE = 2;
+
+ private void touch_start(float x, float y) {
+
+ MuPDFView pageView = (MuPDFView)getDisplayedView();
+ if (pageView != null)
+ {
+ pageView.startDraw(x, y);
+ }
+ mX = x;
+ mY = y;
+ }
+
+ private void touch_move(float x, float y) {
+
+ float dx = Math.abs(x - mX);
+ float dy = Math.abs(y - mY);
+ if (dx >= TOUCH_TOLERANCE || dy >= TOUCH_TOLERANCE)
+ {
+ MuPDFView pageView = (MuPDFView)getDisplayedView();
+ if (pageView != null)
+ {
+ pageView.continueDraw(x, y);
+ }
+ mX = x;
+ mY = y;
+ }
+ }
+
+ private void touch_up() {
+
+ // NOOP
+ }
+
protected void onChildSetup(int i, View v) {
if (SearchTaskResult.get() != null
&& SearchTaskResult.get().pageNumber == i)
diff --git a/android/src/com/artifex/mupdfdemo/PageView.java b/android/src/com/artifex/mupdfdemo/PageView.java
index 14d6b729..200821dd 100644
--- a/android/src/com/artifex/mupdfdemo/PageView.java
+++ b/android/src/com/artifex/mupdfdemo/PageView.java
@@ -364,16 +364,30 @@ public abstract class PageView extends ViewGroup {
if (arc.size() >= 2) {
Iterator<PointF> iit = arc.iterator();
p = iit.next();
- path.moveTo(p.x*scale, p.y*scale);
+ float mX = p.x * scale;
+ float mY = p.y * scale;
+ path.moveTo(mX, mY);
while (iit.hasNext()) {
p = iit.next();
- path.lineTo(p.x*scale, p.y*scale);
+ float x = p.x * scale;
+ float y = p.y * scale;
+ path.quadTo(mX, mY, (x + mX) / 2, (y + mY) / 2);
+ mX = x;
+ mY = y;
}
+ path.lineTo(mX, mY);
}
}
+
+ paint.setAntiAlias(true);
+ paint.setDither(true);
+ paint.setStrokeJoin(Paint.Join.ROUND);
+ paint.setStrokeCap(Paint.Cap.ROUND);
+
paint.setStyle(Paint.Style.STROKE);
- paint.setStrokeWidth(INK_THICKNESS*scale);
+ paint.setStrokeWidth(INK_THICKNESS * scale);
paint.setColor(INK_COLOR);
+
canvas.drawPath(path, paint);
}
}
diff --git a/pdf/pdf_annot.c b/pdf/pdf_annot.c
index ad89725b..37c89902 100644
--- a/pdf/pdf_annot.c
+++ b/pdf/pdf_annot.c
@@ -1141,6 +1141,7 @@ pdf_set_ink_obj_appearance(pdf_document *doc, pdf_obj *annot)
for (i = 0; i < n; i ++)
{
+ fz_point pt_last;
pdf_obj *arc = pdf_array_get(list, i);
m = pdf_array_len(arc);
@@ -1163,8 +1164,10 @@ pdf_set_ink_obj_appearance(pdf_document *doc, pdf_obj *annot)
if (j == 0)
fz_moveto(ctx, path, pt.x, pt.y);
else
- fz_lineto(ctx, path, pt.x, pt.y);
+ fz_curvetov(ctx, path, pt_last.x, pt_last.y, (pt.x + pt_last.x) / 2, (pt.y + pt_last.y) / 2);
+ pt_last = pt;
}
+ fz_lineto(ctx, path, pt_last.x, pt_last.y);
}
fz_stroke_path(dev, path, stroke, &fz_identity, cs, color, 1.0f);