Index: samplecode/SampleApp.cpp |
diff --git a/samplecode/SampleApp.cpp b/samplecode/SampleApp.cpp |
index 5bb223a31244adf0a3f7f3cb1bfc8e77372f8e8f..55a9aaceb93bc34fbbffa44d6e86b82c66bd42a4 100644 |
--- a/samplecode/SampleApp.cpp |
+++ b/samplecode/SampleApp.cpp |
@@ -44,6 +44,9 @@ |
class GrContext; |
#endif |
+// Should be 3x + 1 |
+#define kMaxFatBitsScale 28 |
+ |
extern SampleView* CreateSamplePictFileView(const char filename[]); |
class PictFileFactory : public SkViewFactory { |
@@ -634,31 +637,27 @@ bool SampleWindow::sendAnimatePulse() { |
return false; |
} |
-void SampleWindow::setZoomCenter(float x, float y) |
-{ |
+void SampleWindow::setZoomCenter(float x, float y) { |
fZoomCenterX = x; |
fZoomCenterY = y; |
} |
-bool SampleWindow::zoomIn() |
-{ |
+bool SampleWindow::zoomIn() { |
// Arbitrarily decided |
- if (fFatBitsScale == 25) return false; |
+ if (fFatBitsScale == kMaxFatBitsScale) return false; |
fFatBitsScale++; |
this->inval(NULL); |
return true; |
} |
-bool SampleWindow::zoomOut() |
-{ |
+bool SampleWindow::zoomOut() { |
if (fFatBitsScale == 1) return false; |
fFatBitsScale--; |
this->inval(NULL); |
return true; |
} |
-void SampleWindow::updatePointer(int x, int y) |
-{ |
+void SampleWindow::updatePointer(int x, int y) { |
fMouseX = x; |
fMouseY = y; |
if (fShowZoomer) { |
@@ -1079,89 +1078,162 @@ void SampleWindow::magnify(SkCanvas* canvas) { |
canvas->restoreToCount(count); |
} |
-void SampleWindow::showZoomer(SkCanvas* canvas) { |
- int count = canvas->save(); |
- canvas->resetMatrix(); |
- // Ensure the mouse position is on screen. |
- int width = SkScalarRoundToInt(this->width()); |
- int height = SkScalarRoundToInt(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; |
+static SkPaint& set_color_ref(SkPaint& paint, SkColor c) { |
+ paint.setColor(c); |
+ return paint; |
+} |
- SkBitmap bitmap = capture_bitmap(canvas); |
- bitmap.lockPixels(); |
- |
- // Find the size of the zoomed in view, forced to be odd, so the examined pixel is in the middle. |
- int zoomedWidth = (width >> 1) | 1; |
- int zoomedHeight = (height >> 1) | 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); |
+static void show_lcd_box(SkCanvas* canvas, SkScalar x, SkScalar y, SkColor c, |
+ SkScalar sx, SkScalar sy) { |
+ const SkScalar w = (1 - 1/sx) / 3; |
+ SkPaint paint; |
+ SkRect r = SkRect::MakeXYWH(x, y, w, 1 - 1/sy); |
+ canvas->drawRect(r, set_color_ref(paint, SkColorSetRGB(SkColorGetR(c), 0, 0))); |
+ r.offset(w, 0); |
+ canvas->drawRect(r, set_color_ref(paint, SkColorSetRGB(0, SkColorGetG(c), 0))); |
+ r.offset(w, 0); |
+ canvas->drawRect(r, set_color_ref(paint, SkColorSetRGB(0, 0, SkColorGetB(c)))); |
+} |
+ |
+static void show_lcd_circle(SkCanvas* canvas, SkScalar x, SkScalar y, SkColor c, |
+ SkScalar, SkScalar) { |
+ const SkRect r = SkRect::MakeXYWH(x, y, 1, 1); |
+ const SkScalar cx = x + 0.5f; |
+ const SkScalar cy = y + 0.5f; |
+ |
+ SkPaint paint; |
+ paint.setAntiAlias(true); |
+ |
+ SkPath path; |
+ path.addArc(r, 0, 120); path.lineTo(cx, cy); |
+ canvas->drawPath(path, set_color_ref(paint, SkColorSetRGB(SkColorGetR(c), 0, 0))); |
+ |
+ path.reset(); path.addArc(r, 120, 120); path.lineTo(cx, cy); |
+ canvas->drawPath(path, set_color_ref(paint, SkColorSetRGB(0, SkColorGetG(c), 0))); |
+ |
+ path.reset(); path.addArc(r, 240, 120); path.lineTo(cx, cy); |
+ canvas->drawPath(path, set_color_ref(paint, SkColorSetRGB(0, 0, SkColorGetB(c)))); |
+} |
+ |
+typedef void (*ShowLCDProc)(SkCanvas*, SkScalar, SkScalar, SkColor, SkScalar, SkScalar); |
+ |
+/* |
+ * Like drawBitmapRect but we manually draw each pixels in RGB |
+ */ |
+static void show_lcd_grid(SkCanvas* canvas, const SkBitmap& bitmap, |
+ const SkIRect& origSrc, const SkRect& dst) { |
+ SkIRect src; |
+ if (!src.intersect(origSrc, bitmap.bounds())) { |
+ return; |
+ } |
+ const SkScalar sx = dst.width() / src.width(); |
+ const SkScalar sy = dst.height() / src.height(); |
+ |
+ SkAutoCanvasRestore acr(canvas, true); |
+ canvas->translate(dst.left(), dst.top()); |
+ canvas->scale(sx, sy); |
+ |
+ ShowLCDProc proc = show_lcd_box; |
+ if (true) { |
+ proc = show_lcd_circle; |
+ } |
+ |
+ for (int y = 0; y < src.height(); ++y) { |
+ for (int x = 0; x < src.width(); ++x) { |
+ proc(canvas, SkIntToScalar(x), SkIntToScalar(y), |
+ bitmap.getColor(src.left() + x, src.top() + y), sx, sy); |
+ } |
+ } |
+} |
+ |
+void SampleWindow::showZoomer(SkCanvas* canvas) { |
+ int count = canvas->save(); |
+ canvas->resetMatrix(); |
+ // Ensure the mouse position is on screen. |
+ int width = SkScalarRoundToInt(this->width()); |
+ int height = SkScalarRoundToInt(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); |
+ bitmap.lockPixels(); |
+ |
+ // Find the size of the zoomed in view, forced to be odd, so the examined pixel is in the middle. |
+ int zoomedWidth = (width >> 1) | 1; |
+ int zoomedHeight = (height >> 1) | 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); |
+ if (fFatBitsScale < kMaxFatBitsScale) { |
canvas->drawBitmapRect(bitmap, src, dest, NULL); |
- 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); |
+ } else { |
+ show_lcd_grid(canvas, 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); |
} |
- 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); |
+ 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) { |