Move zoomer into SampleApp
authorScroggo <Scroggo@2bbb7eff-a529-9590-31e7-b0007b416f81>
Thu, 24 Mar 2011 18:35:50 +0000 (18:35 +0000)
committerScroggo <Scroggo@2bbb7eff-a529-9590-31e7-b0007b416f81>
Thu, 24 Mar 2011 18:35:50 +0000 (18:35 +0000)
git-svn-id: http://skia.googlecode.com/svn/trunk@1002 2bbb7eff-a529-9590-31e7-b0007b416f81

include/views/SkOSWindow_Unix.h
samplecode/SampleApp.cpp
src/utils/mac/SkOSWindow_Mac.cpp
src/utils/unix/SkOSWindow_Unix.cpp
unix_test_app/main.cpp

index 4e8db55..e991828 100644 (file)
@@ -22,7 +22,6 @@
 
 class SkBitmap;
 class SkEvent;
-class SkTypeface;
 
 struct SkUnixWindow {
   Display* fDisplay;
@@ -43,10 +42,6 @@ public:
     bool attachGL();
     void detachGL();
     void presentGL();
-    void updatePointer(int x, int y);
-    void toggleZoomer();
-    bool zoomIn();
-    bool zoomOut();
 
     //static bool PostEvent(SkEvent* evt, SkEventSinkID, SkMSec delay);
 
@@ -65,12 +60,6 @@ private:
     SkUnixWindow  fUnixWindow;
 
     void    doPaint();
-    // Latest position of the mouse.
-    int fMouseX, fMouseY;
-    int fScale;
-    // Used by the text showing position and color values.
-    SkTypeface* fTypeface;
-    bool fShowZoomer;
 
     typedef SkWindow INHERITED;
 };
index b7fe051..0cc85fe 100644 (file)
@@ -12,6 +12,7 @@
 #include "SampleCode.h"
 #include "GrContext.h"
 #include "SkTouchGesture.h"
+#include "SkTypeface.h"
 
 #define USE_ARROWS_FOR_ZOOM true
 //#define DEFAULT_TO_GPU
@@ -268,6 +269,14 @@ private:
     bool fScale;
     bool fRequestGrabImage;
 
+    // The following are for the 'fatbits' drawing
+    // Latest position of the mouse.
+    int fMouseX, fMouseY;
+    int fFatBitsScale;
+    // Used by the text showing position and color values.
+    SkTypeface* fTypeface;
+    bool fShowZoomer;
+
     LCDTextDrawFilter::Mode fLCDMode;
 
     int fScrollTestX, fScrollTestY;
@@ -279,6 +288,11 @@ private:
     void updateTitle();
     bool nextSample();
 
+    void toggleZoomer();
+    bool zoomIn();
+    bool zoomOut();
+    void updatePointer(int x, int y);
+
     void postAnimatingEvent() {
         if (fAnimating) {
             SkEvent* evt = new SkEvent(ANIMATING_EVENTTYPE);
@@ -292,6 +306,38 @@ private:
     typedef SkOSWindow INHERITED;
 };
 
+bool SampleWindow::zoomIn()
+{
+    // Arbitrarily decided
+    if (fFatBitsScale == 25) return false;
+    fFatBitsScale++;
+    this->inval(NULL);
+    return true;
+}
+
+bool SampleWindow::zoomOut()
+{
+    if (fFatBitsScale == 1) return false;
+    fFatBitsScale--;
+    this->inval(NULL);
+    return true;
+}
+
+void SampleWindow::toggleZoomer()
+{
+    fShowZoomer = !fShowZoomer;
+    this->inval(NULL);
+}
+
+void SampleWindow::updatePointer(int x, int y)
+{
+    fMouseX = x;
+    fMouseY = y;
+    if (fShowZoomer) {
+        this->inval(NULL);
+    }
+}
+
 bool SampleWindow::make3DReady() {
 
 #if defined(SK_SUPPORT_GL)
@@ -345,6 +391,11 @@ SampleWindow::SampleWindow(void* hwnd) : INHERITED(hwnd) {
     fLCDMode = LCDTextDrawFilter::kNeutral_Mode;
     fScrollTestX = fScrollTestY = 0;
 
+    fMouseX = fMouseY = 0;
+    fFatBitsScale = 1;
+    fTypeface = SkTypeface::CreateFromTypeface(NULL, SkTypeface::kBold);
+    fShowZoomer = false;
+
     fZoomLevel = 0;
     fZoomScale = SK_Scalar1;
 
@@ -374,6 +425,7 @@ SampleWindow::~SampleWindow() {
     if (NULL != fGrContext) {
         fGrContext->unref();
     }
+    fTypeface->unref();
 }
 
 static SkBitmap capture_bitmap(SkCanvas* canvas) {
@@ -401,6 +453,26 @@ static bool bitmap_diff(SkCanvas* canvas, const SkBitmap& orig,
     return false;
 }
 
+static void drawText(SkCanvas* canvas, SkString string, SkScalar left, SkScalar top, SkPaint& paint)
+{
+    SkColor desiredColor = paint.getColor();
+    paint.setColor(SK_ColorWHITE);
+    const char* c_str = string.c_str();
+    size_t size = string.size();
+    SkRect bounds;
+    paint.measureText(c_str, size, &bounds);
+    bounds.offset(left, top);
+    SkScalar inset = SkIntToScalar(-2);
+    bounds.inset(inset, inset);
+    canvas->drawRect(bounds, paint);
+    if (desiredColor != SK_ColorBLACK) {
+        paint.setColor(SK_ColorBLACK);
+        canvas->drawText(c_str, size, left + SK_Scalar1, top + SK_Scalar1, paint);
+    }
+    paint.setColor(desiredColor);
+    canvas->drawText(c_str, size, left, top, paint);
+}
+
 #define XCLIP_N  8
 #define YCLIP_N  8
 
@@ -473,6 +545,87 @@ void SampleWindow::draw(SkCanvas* canvas) {
     } else {
         this->INHERITED::draw(canvas);
     }
+    if (fShowZoomer) {
+        int count = canvas->save();
+        canvas->resetMatrix();
+        // Ensure the mouse position is on screen.
+        int width = this->width();
+        int height = this->height();
+        if (fMouseX >= width) fMouseX = width - 1;
+        else if (fMouseX < 0) fMouseX = 0;
+        if (fMouseY >= height) fMouseY = height - 1;
+        else if (fMouseY < 0) fMouseY = 0;
+        SkBitmap bitmap = capture_bitmap(canvas);
+        // Find the size of the zoomed in view, forced to be odd, so the examined pixel is in the middle.
+        int zoomedWidth = (width >> 2) | 1;
+        int zoomedHeight = (height >> 2) | 1;
+        SkIRect src;
+        src.set(0, 0, zoomedWidth / fFatBitsScale, zoomedHeight / fFatBitsScale);
+        src.offset(fMouseX - (src.width()>>1), fMouseY - (src.height()>>1));
+        SkRect dest;
+        dest.set(0, 0, SkIntToScalar(zoomedWidth), SkIntToScalar(zoomedHeight));
+        dest.offset(SkIntToScalar(width - zoomedWidth), SkIntToScalar(height - zoomedHeight));
+        SkPaint paint;
+        // Clear the background behind our zoomed in view
+        paint.setColor(SK_ColorWHITE);
+        canvas->drawRect(dest, paint);
+        canvas->drawBitmapRect(bitmap, &src, dest);
+        paint.setColor(SK_ColorBLACK);
+        paint.setStyle(SkPaint::kStroke_Style);
+        // Draw a border around the pixel in the middle
+        SkRect originalPixel;
+        originalPixel.set(SkIntToScalar(fMouseX), SkIntToScalar(fMouseY), SkIntToScalar(fMouseX + 1), SkIntToScalar(fMouseY + 1));
+        SkMatrix matrix;
+        SkRect scalarSrc;
+        scalarSrc.set(src);
+        SkColor color = bitmap.getColor(fMouseX, fMouseY);
+        if (matrix.setRectToRect(scalarSrc, dest, SkMatrix::kFill_ScaleToFit)) {
+            SkRect pixel;
+            matrix.mapRect(&pixel, originalPixel);
+            // TODO Perhaps measure the values and make the outline white if it's "dark"
+            if (color == SK_ColorBLACK) {
+                paint.setColor(SK_ColorWHITE);
+            }
+            canvas->drawRect(pixel, paint);
+        }
+        paint.setColor(SK_ColorBLACK);
+        // Draw a border around the destination rectangle
+        canvas->drawRect(dest, paint);
+        paint.setStyle(SkPaint::kStrokeAndFill_Style);
+        // Identify the pixel and its color on screen
+        paint.setTypeface(fTypeface);
+        paint.setAntiAlias(true);
+        SkScalar lineHeight = paint.getFontMetrics(NULL);
+        SkString string;
+        string.appendf("(%i, %i)", fMouseX, fMouseY);
+        SkScalar left = dest.fLeft + SkIntToScalar(3);
+        SkScalar i = SK_Scalar1;
+        drawText(canvas, string, left, SkScalarMulAdd(lineHeight, i, dest.fTop), paint);
+        // Alpha
+        i += SK_Scalar1;
+        string.reset();
+        string.appendf("A: %X", SkColorGetA(color));
+        drawText(canvas, string, left, SkScalarMulAdd(lineHeight, i, dest.fTop), paint);
+        // Red
+        i += SK_Scalar1;
+        string.reset();
+        string.appendf("R: %X", SkColorGetR(color));
+        paint.setColor(SK_ColorRED);
+        drawText(canvas, string, left, SkScalarMulAdd(lineHeight, i, dest.fTop), paint);
+        // Green
+        i += SK_Scalar1;
+        string.reset();
+        string.appendf("G: %X", SkColorGetG(color));
+        paint.setColor(SK_ColorGREEN);
+        drawText(canvas, string, left, SkScalarMulAdd(lineHeight, i, dest.fTop), paint);
+        // Blue
+        i += SK_Scalar1;
+        string.reset();
+        string.appendf("B: %X", SkColorGetB(color));
+        paint.setColor(SK_ColorBLUE);
+        drawText(canvas, string, left, SkScalarMulAdd(lineHeight, i, dest.fTop), paint);
+        canvas->restoreToCount(count);
+    }
 }
 
 void SampleWindow::onDraw(SkCanvas* canvas) {
@@ -825,8 +978,6 @@ bool SampleWindow::onHandleChar(SkUnichar uni) {
             this->updateTitle();
             this->inval(NULL);
             break;
-#ifdef SK_BUILD_FOR_UNIX
-        // These methods have not been written for other platforms yet.
         case 'i':
             this->zoomIn();
             break;
@@ -836,7 +987,6 @@ bool SampleWindow::onHandleChar(SkUnichar uni) {
         case 'z':
             this->toggleZoomer();
             break;
-#endif
         default:
             break;
     }
@@ -912,6 +1062,9 @@ bool SampleWindow::onHandleKey(SkKey key) {
 static const char gGestureClickType[] = "GestureClickType";
 
 bool SampleWindow::onDispatchClick(int x, int y, Click::State state) {
+    if (Click::kMoved_State == state) {
+        updatePointer(x, y);
+    }
     int w = SkScalarRound(this->width());
     int h = SkScalarRound(this->height());
 
index 39b7106..ac0f203 100644 (file)
@@ -125,6 +125,7 @@ SkOSWindow::SkOSWindow(void* hWnd) : fHWND(hWnd), fAGLCtx(NULL)
         { kEventClassKeyboard,  kEventRawKeyUp              },
                { kEventClassMouse,             kEventMouseDown                         },
                { kEventClassMouse,             kEventMouseDragged                      },
+               { kEventClassMouse,             kEventMouseMoved                        },
                { kEventClassMouse,             kEventMouseUp                           },
                { kEventClassTextInput, kEventTextInputUnicodeForKeyEvent   },
                { kEventClassWindow,    kEventWindowBoundsChanged       },
@@ -334,6 +335,8 @@ pascal OSStatus SkOSWindow::EventHandler( EventHandlerCallRef inHandler, EventRe
                         result = noErr;
                     }
                     break;
+                case kEventMouseMoved:
+                    // fall through
                 case kEventMouseDragged:
                     (void)win->handleClick(pt.h, pt.v, Click::kMoved_State);
                   //  result = noErr;
index 8e348ac..83db6ad 100644 (file)
@@ -9,20 +9,14 @@
 #include "SkCanvas.h"
 #include "SkColor.h"
 #include "SkEvent.h"
-#include "SkTypeface.h"
 
 SkOSWindow::SkOSWindow(void* unused)
 {
     fUnixWindow.fDisplay = NULL;
-    fMouseX = fMouseY = 0;
-    fTypeface = SkTypeface::CreateFromTypeface(NULL, SkTypeface::kBold);
-    fShowZoomer = false;
-    fScale = 4;
 }
 
 SkOSWindow::~SkOSWindow()
 {
-    fTypeface->unref();
 }
 
 void SkOSWindow::setUnixWindow(Display* dsp, Window win, size_t screenNumber, GC gc)
@@ -48,29 +42,6 @@ void SkOSWindow::presentGL()
 
 }
 
-bool SkOSWindow::zoomIn()
-{
-    // Arbitrarily decided
-    if (fScale == 25) return false;
-    fScale++;
-    inval(NULL);
-    return true;
-}
-
-bool SkOSWindow::zoomOut()
-{
-    if (fScale == 1) return false;
-    fScale--;
-    inval(NULL);
-    return true;
-}
-
-void SkOSWindow::toggleZoomer()
-{
-    fShowZoomer = !fShowZoomer;
-    inval(NULL);
-}
-
 void SkOSWindow::onSetTitle(const char title[])
 {
     if (!fUnixWindow.fDisplay) return;
@@ -117,33 +88,6 @@ static bool convertBitmapToXImage(XImage& image, const SkBitmap& bitmap)
     return XInitImage(&image);
 }
 
-void SkOSWindow::updatePointer(int x, int y)
-{
-    fMouseX = x;
-    fMouseY = y;
-    inval(NULL);
-}
-
-static void drawText(SkCanvas& canvas, SkString string, SkScalar left, SkScalar top, SkPaint& paint)
-{
-    SkColor desiredColor = paint.getColor();
-    paint.setColor(SK_ColorWHITE);
-    const char* c_str = string.c_str();
-    size_t size = string.size();
-    SkRect bounds;
-    paint.measureText(c_str, size, &bounds);
-    bounds.offset(left, top);
-    SkScalar inset = SkIntToScalar(-2);
-    bounds.inset(inset, inset);
-    canvas.drawRect(bounds, paint);
-    if (desiredColor != SK_ColorBLACK) {
-        paint.setColor(SK_ColorBLACK);
-        canvas.drawText(c_str, size, left + SK_Scalar1, top + SK_Scalar1, paint);
-    }
-    paint.setColor(desiredColor);
-    canvas.drawText(c_str, size, left, top, paint);
-}
-
 void SkOSWindow::doPaint() {
     if (!fUnixWindow.fDisplay) return;
     // Draw the bitmap to the screen.
@@ -151,94 +95,10 @@ void SkOSWindow::doPaint() {
     int width = bitmap.width();
     int height = bitmap.height();
 
-    if (!fShowZoomer) {
-        XImage image;
-        if (!convertBitmapToXImage(image, bitmap)) return;
+    XImage image;
+    if (!convertBitmapToXImage(image, bitmap)) return;
 
-        XPutImage(fUnixWindow.fDisplay, fUnixWindow.fWin, fUnixWindow.fGc, &image, 0, 0, 0, 0, width, height);
-    } else {
-        // Ensure the mouse position is on screen.
-        if (fMouseX >= width) fMouseX = width - 1;
-        else if (fMouseX < 0) fMouseX = 0;
-        if (fMouseY >= height) fMouseY = height - 1;
-        else if (fMouseY < 0) fMouseY = 0;
-        // zoomedBitmap will show the original bitmap, plus a zoomed in view (fat bits).
-        SkBitmap zoomedBitmap;
-        bitmap.copyTo(&zoomedBitmap, bitmap.getConfig());
-        SkCanvas canvas(zoomedBitmap);
-        // Find the size of the zoomed in view, forced to be odd, so the examined pixel is in the middle.
-        int zoomedWidth = (width >> 2) | 1;
-        int zoomedHeight = (height >> 2) | 1;
-        SkIRect src;
-        src.set(0, 0, zoomedWidth / fScale, zoomedHeight / fScale);
-        src.offset(fMouseX - (src.width()>>1), fMouseY - (src.height()>>1));
-        SkRect dest;
-        dest.set(0, 0, SkIntToScalar(zoomedWidth), SkIntToScalar(zoomedHeight));
-        dest.offset(SkIntToScalar(width - zoomedWidth), SkIntToScalar(height - zoomedHeight));
-        SkPaint paint;
-        // Clear the background behind our zoomed in view
-        paint.setColor(SK_ColorWHITE);
-        canvas.drawRect(dest, paint);
-        canvas.drawBitmapRect(bitmap, &src, dest);
-        paint.setColor(SK_ColorBLACK);
-        paint.setStyle(SkPaint::kStroke_Style);
-        // Draw a border around the pixel in the middle
-        SkRect originalPixel;
-        originalPixel.set(SkIntToScalar(fMouseX), SkIntToScalar(fMouseY), SkIntToScalar(fMouseX + 1), SkIntToScalar(fMouseY + 1));
-        SkMatrix matrix;
-        SkRect scalarSrc;
-        scalarSrc.set(src);
-        SkColor color = bitmap.getColor(fMouseX, fMouseY);
-        if (matrix.setRectToRect(scalarSrc, dest, SkMatrix::kFill_ScaleToFit)) {
-            SkRect pixel;
-            matrix.mapRect(&pixel, originalPixel);
-            // TODO Perhaps measure the values and make the outline white if it's "dark"
-            if (color == SK_ColorBLACK) {
-                paint.setColor(SK_ColorWHITE);
-            }
-            canvas.drawRect(pixel, paint);
-        }
-        paint.setColor(SK_ColorBLACK);
-        // Draw a border around the destination rectangle
-        canvas.drawRect(dest, paint);
-        paint.setStyle(SkPaint::kStrokeAndFill_Style);
-        // Identify the pixel and its color on screen
-        paint.setTypeface(fTypeface);
-        paint.setAntiAlias(true);
-        SkScalar lineHeight = paint.getFontMetrics(NULL);
-        SkString string;
-        string.appendf("(%i, %i)", fMouseX, fMouseY);
-        SkScalar left = dest.fLeft + SkIntToScalar(3); 
-        SkScalar i = SK_Scalar1;
-        drawText(canvas, string, left, SkScalarMulAdd(lineHeight, i, dest.fTop), paint);
-        // Alpha
-        i += SK_Scalar1;
-        string.reset();
-        string.appendf("A: %X", SkColorGetA(color));
-        drawText(canvas, string, left, SkScalarMulAdd(lineHeight, i, dest.fTop), paint);
-        // Red
-        i += SK_Scalar1;
-        string.reset();
-        string.appendf("R: %X", SkColorGetR(color));
-        paint.setColor(SK_ColorRED);
-        drawText(canvas, string, left, SkScalarMulAdd(lineHeight, i, dest.fTop), paint);
-        // Green
-        i += SK_Scalar1;
-        string.reset();
-        string.appendf("G: %X", SkColorGetG(color));
-        paint.setColor(SK_ColorGREEN);
-        drawText(canvas, string, left, SkScalarMulAdd(lineHeight, i, dest.fTop), paint);
-        // Blue
-        i += SK_Scalar1;
-        string.reset();
-        string.appendf("B: %X", SkColorGetB(color));
-        paint.setColor(SK_ColorBLUE);
-        drawText(canvas, string, left, SkScalarMulAdd(lineHeight, i, dest.fTop), paint);
-        // Finally, put our bitmap on the screen
-        XImage zoomedImage;
-        convertBitmapToXImage(zoomedImage, zoomedBitmap);
-        XPutImage(fUnixWindow.fDisplay, fUnixWindow.fWin, fUnixWindow.fGc, &zoomedImage, 0, 0, 0, 0, width, height);
-    }
+    XPutImage(fUnixWindow.fDisplay, fUnixWindow.fWin, fUnixWindow.fGc, &image, 0, 0, 0, 0, width, height);
 }
 
 bool SkOSWindow::onHandleChar(SkUnichar)
index deb95bc..ef8f214 100644 (file)
@@ -96,10 +96,7 @@ int main(){
                     window->handleClick(evt.xbutton.x, evt.xbutton.y, SkView::Click::kUp_State);
                 break;
             case MotionNotify:
-                // FIXME: 272 corresponds to the left mouse button, but should be a constant.
-                if (evt.xmotion.state == 272)
-                    window->handleClick(evt.xmotion.x, evt.xmotion.y, SkView::Click::kMoved_State);
-                window->updatePointer(evt.xmotion.x, evt.xmotion.y);
+                window->handleClick(evt.xmotion.x, evt.xmotion.y, SkView::Click::kMoved_State);
                 break;
             case KeyPress:
             {