android/experimental/LibreOffice4Android/src/org/libreoffice/android/DocumentLoader.java
 |  150 +++++++++-
 1 file changed, 147 insertions(+), 3 deletions(-)

New commits:
commit 24773530143c995820417fd004d227ff9472e51f
Author: Miklos Vajna <vmik...@suse.cz>
Date:   Mon Jul 15 18:01:02 2013 +0200

    LibreOffice4Android: render in a bit better quality
    
    Change-Id: I65984af5e28c8a0250105b34c4bc7b1abf9ce3c7

diff --git 
a/android/experimental/LibreOffice4Android/src/org/libreoffice/android/DocumentLoader.java
 
b/android/experimental/LibreOffice4Android/src/org/libreoffice/android/DocumentLoader.java
index df09708..d67d6e6 100644
--- 
a/android/experimental/LibreOffice4Android/src/org/libreoffice/android/DocumentLoader.java
+++ 
b/android/experimental/LibreOffice4Android/src/org/libreoffice/android/DocumentLoader.java
@@ -574,6 +574,7 @@ public class DocumentLoader
         static final String TAG = "PAGE_VIEWER";
         int width ;
         int height;
+        double zoomFactor;
 
         class PageLoadTask
             extends AsyncTask<Integer, Void, Integer>
@@ -588,13 +589,19 @@ public class DocumentLoader
 
                 state = PageState.LOADING;
                 currentPageNumber = number;
-                ByteBuffer bb = renderPage(currentPageNumber , params[1] , 
params[2]);//
-                bm = Bitmap.createBitmap( width, height, 
Bitmap.Config.ARGB_8888);
+                ByteBuffer bb = renderPage(currentPageNumber, 
getZoomed(params[1]), getZoomed(params[2]));//
+                bm = Bitmap.createBitmap(getZoomed(width), getZoomed(height), 
Bitmap.Config.ARGB_8888);
                 bm.copyPixelsFromBuffer(bb);
 
                 return currentPageNumber;
             }
 
+            int getZoomed(int in)
+            {
+                double zoomed = in * zoomFactor;
+                return (int)zoomed;
+            }
+
             protected void onPostExecute(Integer result)
             {
                 Log.i(PageViewer.TAG, "onPostExecute: " + result);
@@ -651,6 +658,8 @@ public class DocumentLoader
                return;
             this.width = width ;
             this.height = height;
+            // Render in a bit better quality, so it makes sense to zoom.
+            zoomFactor = Math.sqrt(2);
             waitView = new TextView(DocumentLoader.this);
             waitView.setTextSize(24);
             waitView.setGravity(Gravity.CENTER);
commit 847fa448107574011745a530864ffd76b7531378
Author: Miklos Vajna <vmik...@suse.cz>
Date:   Mon Jul 15 17:36:11 2013 +0200

    LibreOffice4Android: support pinch zoom and dragging around while in zoom
    
    Change-Id: Ic8e4cb30acff734e6860dfc9bb31e836d2ecd32d

diff --git 
a/android/experimental/LibreOffice4Android/src/org/libreoffice/android/DocumentLoader.java
 
b/android/experimental/LibreOffice4Android/src/org/libreoffice/android/DocumentLoader.java
index 1373f37..df09708 100644
--- 
a/android/experimental/LibreOffice4Android/src/org/libreoffice/android/DocumentLoader.java
+++ 
b/android/experimental/LibreOffice4Android/src/org/libreoffice/android/DocumentLoader.java
@@ -32,6 +32,7 @@ package org.libreoffice.android;
 import org.libreoffice.R;
 
 import android.app.Activity;
+import android.graphics.PointF;
 import android.graphics.Bitmap;
 import android.graphics.Matrix;
 import android.graphics.Color;
@@ -41,10 +42,12 @@ import android.graphics.Canvas;
 import android.graphics.Paint;
 import android.os.AsyncTask;
 import android.os.Bundle;
+import android.util.FloatMath;
 import android.util.Log;
 import android.view.GestureDetector;
 import android.view.Gravity;
 import android.view.MotionEvent;
+import android.view.View.OnTouchListener;
 import android.view.ViewGroup;
 import android.view.animation.Animation;
 import android.view.animation.AnimationSet;
@@ -52,6 +55,7 @@ import android.view.animation.TranslateAnimation;
 import android.widget.ImageView;
 import android.widget.RelativeLayout;
 import android.widget.TextView;
+import android.widget.ImageView.ScaleType;
 import android.widget.ViewFlipper;
 import android.widget.ViewSwitcher;
 import android.view.MenuItem;
@@ -129,6 +133,7 @@ public class DocumentLoader
     XRenderable renderable;
 
     GestureDetector gestureDetector;
+    ScaleListener scaleDetector;
 
     ViewGroup.LayoutParams matchParent;
 
@@ -149,15 +154,19 @@ public class DocumentLoader
                                float velocityY)
         {
             Log.i(TAG, "onFling: " + event1 + " " + event2);
+            if (scaleDetector.inZoom())
+                return false;
             ViewFlipper flipper = documentViewer.getFlipper();
             if (event1.getX() - event2.getX() > 120) {
                 if (((PageViewer)flipper.getCurrentView()).currentPageNumber 
== pageCount-1)
                     return false;
+                scaleDetector.reset();
                 documentViewer.nextPage();
                 return true;
             } else if (event2.getX() - event1.getX() > 120) {
                 if (((PageViewer)flipper.getCurrentView()).currentPageNumber 
== 0)
                     return false;
+                scaleDetector.reset();
                 documentViewer.prevPage();
                 return true;
             }
@@ -188,6 +197,127 @@ public class DocumentLoader
         
     }
 
+    class ScaleListener implements OnTouchListener
+    {
+        public ScaleListener()
+        {
+            reset();
+        }
+
+        public boolean onTouch(View v, MotionEvent event)
+        {
+            PageViewer pageViewer = (PageViewer)v;
+            ImageView view = (ImageView)pageViewer.getCurrentView();
+            if (view.getScaleType() == ScaleType.FIT_CENTER)
+            {
+                origValues = new float[9];
+                view.getImageMatrix().getValues(origValues);
+                matrix.setValues(origValues);
+                view.setScaleType(ScaleType.MATRIX);
+            }
+
+            switch (event.getAction() & MotionEvent.ACTION_MASK)
+            {
+            case MotionEvent.ACTION_DOWN:
+                if (inZoom())
+                {
+                    savedMatrix.set(matrix);
+                    start.set(event.getX(), event.getY());
+                    mode = DRAG;
+                }
+                break;
+            case MotionEvent.ACTION_POINTER_DOWN:
+                oldDist = spacing(event);
+                if (oldDist > 10f) {
+                    savedMatrix.set(matrix);
+                    midPoint(mid, event);
+                    mode = ZOOM;
+                }
+                break;
+            case MotionEvent.ACTION_UP:
+            case MotionEvent.ACTION_POINTER_UP:
+                mode = NONE;
+                float[] values = new float[9];
+                view.getImageMatrix().getValues(values);
+                currentScaleX = values[Matrix.MSCALE_X];
+                currentScaleY = values[Matrix.MSCALE_Y];
+                if (currentScaleX < origValues[Matrix.MSCALE_X])
+                    matrix.setValues(origValues);
+                break;
+            case MotionEvent.ACTION_MOVE:
+                if (mode == DRAG) {
+                    matrix.set(savedMatrix);
+                    matrix.postTranslate(event.getX() - start.x, -1 * 
(event.getY() - start.y));
+                }
+                else if (mode == ZOOM) {
+                    float newDist = spacing(event);
+                    if (newDist > 10f) {
+                        matrix.set(savedMatrix);
+                        float scale = newDist / oldDist;
+                        matrix.postScale(scale, scale, mid.x, mid.y);
+                    }
+                }
+                break;
+            }
+
+            view.setImageMatrix(matrix);
+            return true;
+        }
+
+        private float spacing(MotionEvent event)
+        {
+            float x = event.getX(0) - event.getX(1);
+            float y = event.getY(0) - event.getY(1);
+            return FloatMath.sqrt(x * x + y * y);
+        }
+
+        private void midPoint(PointF point, MotionEvent event)
+        {
+            float x = event.getX(0) + event.getX(1);
+            float y = event.getY(0) + event.getY(1);
+            point.set(x / 2, y / 2);
+        }
+
+        public void reset()
+        {
+            if (documentViewer != null)
+            {
+                PageViewer pageViewer = 
(PageViewer)documentViewer.viewFlipper.getCurrentView();
+                
((ImageView)pageViewer.getCurrentView()).setScaleType(ScaleType.FIT_CENTER);
+            }
+            matrix = new Matrix();
+            savedMatrix = new Matrix();
+            mode = NONE;
+            start = new PointF();
+            mid = new PointF();
+            oldDist = 1f;
+            origValues = null;
+            currentScaleX = 0;
+            currentScaleY = 0;
+        }
+
+        public boolean inZoom()
+        {
+            return origValues != null && origValues[Matrix.MSCALE_X] < 
currentScaleX;
+        }
+
+        Matrix matrix; // Matrix of the current view
+        Matrix savedMatrix; // Matrix when the user started the touch.
+
+        static final int NONE = 0;
+        static final int DRAG = 1;
+        static final int ZOOM = 2;
+        int mode;
+
+        PointF start;
+        PointF mid;
+        float oldDist;
+
+        float[] origValues;
+        float currentScaleX;
+        float currentScaleY;
+    }
+
     class MyXController
         implements XController
     {
@@ -950,6 +1080,7 @@ public class DocumentLoader
                extras = getIntent().getExtras();
 
         gestureDetector = new GestureDetector(this, new GestureListener());
+        scaleDetector = new ScaleListener();
 
         try {
             long t0 = System.currentTimeMillis();
@@ -1092,7 +1223,11 @@ public class DocumentLoader
     @Override
     public boolean onTouchEvent(MotionEvent event)
     {
-        return gestureDetector.onTouchEvent(event);
+        if (gestureDetector.onTouchEvent(event))
+            return true;
+        if (scaleDetector.onTouch(documentViewer.viewFlipper.getCurrentView(), 
event))
+            return true;
+        return false;
     }
     
     @Override
_______________________________________________
Libreoffice-commits mailing list
libreoffice-comm...@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits

Reply via email to