add toggle keys:
'x' -- flip around X axis
'y' -- flip around Y axis
'b' -- toggle between normal, forced-on and forced-off antialiasing
git-svn-id: http://skia.googlecode.com/svn/trunk@1054 2bbb7eff-a529-9590-31e7-b0007b416f81
diff --git a/samplecode/SampleApp.cpp b/samplecode/SampleApp.cpp
index 983a910..c525a5d 100644
--- a/samplecode/SampleApp.cpp
+++ b/samplecode/SampleApp.cpp
@@ -79,22 +79,40 @@
//////////////////////////////////////////////////////////////////////////////
+enum FlipAxisEnum {
+ kFlipAxis_X = (1 << 0),
+ kFlipAxis_Y = (1 << 1)
+};
+
+enum SkTriState {
+ kFalse_SkTriState,
+ kTrue_SkTriState,
+ kUnknown_SkTriState,
+};
+
+static SkTriState cycle_tristate(SkTriState state) {
+ static const SkTriState gCycle[] = {
+ /* kFalse_SkTriState -> */ kUnknown_SkTriState,
+ /* kTrue_SkTriState -> */ kFalse_SkTriState,
+ /* kUnknown_SkTriState -> */ kTrue_SkTriState,
+ };
+ return gCycle[state];
+}
+
#include "SkDrawFilter.h"
-class LCDTextDrawFilter : public SkDrawFilter {
+class FlagsDrawFilter : public SkDrawFilter {
public:
- enum Mode {
- kNeutral_Mode,
- kForceOn_Mode,
- kForceOff_Mode
- };
-
- LCDTextDrawFilter(Mode mode) : fMode(mode) {}
+ FlagsDrawFilter(SkTriState lcd, SkTriState aa) : fLCDState(lcd), fAAState(aa) {}
virtual bool filter(SkCanvas*, SkPaint* paint, Type t) {
- if (kText_Type == t && kNeutral_Mode != fMode) {
+ if (kText_Type == t && kUnknown_SkTriState != fLCDState) {
fPrevLCD = paint->isLCDRenderText();
- paint->setLCDRenderText(kForceOn_Mode == fMode);
+ paint->setLCDRenderText(kTrue_SkTriState == fLCDState);
+ }
+ if (kUnknown_SkTriState != fAAState) {
+ fPrevAA = paint->isAntiAlias();
+ paint->setAntiAlias(kTrue_SkTriState == fAAState);
}
return true;
}
@@ -103,25 +121,21 @@
canvas/paint to their previous states
*/
virtual void restore(SkCanvas*, SkPaint* paint, Type t) {
- if (kText_Type == t && kNeutral_Mode != fMode) {
+ if (kText_Type == t && kUnknown_SkTriState != fLCDState) {
paint->setLCDRenderText(fPrevLCD);
}
+ if (kUnknown_SkTriState != fAAState) {
+ paint->setAntiAlias(fPrevAA);
+ }
}
private:
- Mode fMode;
- bool fPrevLCD;
+ SkTriState fLCDState;
+ bool fPrevLCD;
+ SkTriState fAAState;
+ bool fPrevAA;
};
-LCDTextDrawFilter::Mode cycle_lcdmode(LCDTextDrawFilter::Mode mode) {
- static const LCDTextDrawFilter::Mode gCycle[] = {
- /* kNeutral_Mode -> */ LCDTextDrawFilter::kForceOn_Mode,
- /* kForceOn_Mode -> */ LCDTextDrawFilter::kForceOff_Mode,
- /* kForceOff_Mode -> */ LCDTextDrawFilter::kNeutral_Mode
- };
- return gCycle[mode];
-}
-
//////////////////////////////////////////////////////////////////////////////
#define MAX_ZOOM_LEVEL 8
@@ -277,7 +291,9 @@
SkTypeface* fTypeface;
bool fShowZoomer;
- LCDTextDrawFilter::Mode fLCDMode;
+ SkTriState fLCDState;
+ SkTriState fAAState;
+ unsigned fFlipAxis;
int fScrollTestX, fScrollTestY;
@@ -362,6 +378,7 @@
#else
fGrContext = GrContext::Create(GrGpu::kOpenGL_Fixed_Engine, NULL);
#endif
+ SkDebugf("---- constructor\n");
}
if (NULL != fGrContext) {
@@ -402,7 +419,9 @@
fRotate = false;
fScale = false;
fRequestGrabImage = false;
- fLCDMode = LCDTextDrawFilter::kNeutral_Mode;
+ fLCDState = kUnknown_SkTriState;
+ fAAState = kUnknown_SkTriState;
+ fFlipAxis = 0;
fScrollTestX = fScrollTestY = 0;
fMouseX = fMouseY = 0;
@@ -495,10 +514,11 @@
gAnimTimePrev = gAnimTime;
gAnimTime = SkTime::GetMSecs();
+ SkScalar cx = SkScalarHalf(this->width());
+ SkScalar cy = SkScalarHalf(this->height());
+
if (fZoomLevel) {
SkMatrix m;
- SkScalar cx = SkScalarHalf(this->width());
- SkScalar cy = SkScalarHalf(this->height());
SkPoint center;
m = canvas->getTotalMatrix();//.invert(&m);
m.mapXY(cx, cy, ¢er);
@@ -512,6 +532,19 @@
canvas->concat(m);
}
+ if (fFlipAxis) {
+ SkMatrix m;
+ m.setTranslate(cx, cy);
+ if (fFlipAxis & kFlipAxis_X) {
+ m.preScale(-SK_Scalar1, SK_Scalar1);
+ }
+ if (fFlipAxis & kFlipAxis_Y) {
+ m.preScale(SK_Scalar1, -SK_Scalar1);
+ }
+ m.preTranslate(-cx, -cy);
+ canvas->concat(m);
+ }
+
// Apply any gesture matrix
if (true) {
const SkMatrix& localM = fGesture.localM();
@@ -776,6 +809,12 @@
delete fGpuCanvas;
fGpuCanvas = NULL;
presentGL();
+
+#if 1
+ SkDebugf("---- destructor %d\n", fGrContext->refcnt());
+ fGrContext->unref();
+ fGrContext = NULL;
+#endif
break;
#endif
}
@@ -811,8 +850,9 @@
canvas->translate(-cx, -cy);
}
- if (LCDTextDrawFilter::kNeutral_Mode != fLCDMode) {
- canvas->setDrawFilter(new LCDTextDrawFilter(fLCDMode))->unref();
+ if (kUnknown_SkTriState != fLCDState ||
+ kUnknown_SkTriState != fAAState) {
+ canvas->setDrawFilter(new FlagsDrawFilter(fLCDState, fAAState))->unref();
}
}
@@ -988,7 +1028,12 @@
this->inval(NULL);
break;
case 'l':
- fLCDMode = cycle_lcdmode(fLCDMode);
+ fLCDState = cycle_tristate(fLCDState);
+ this->updateTitle();
+ this->inval(NULL);
+ break;
+ case 'b':
+ fAAState = cycle_tristate(fAAState);
this->updateTitle();
this->inval(NULL);
break;
@@ -998,6 +1043,16 @@
case 'o':
this->zoomOut();
break;
+ case 'x':
+ fFlipAxis ^= kFlipAxis_X;
+ this->updateTitle();
+ this->inval(NULL);
+ break;
+ case 'y':
+ fFlipAxis ^= kFlipAxis_Y;
+ this->updateTitle();
+ this->inval(NULL);
+ break;
case 'z':
this->toggleZoomer();
break;
@@ -1167,6 +1222,16 @@
"opengl: "
};
+static const char* trystate_str(SkTriState state,
+ const char trueStr[], const char falseStr[]) {
+ if (kTrue_SkTriState == state) {
+ return trueStr;
+ } else if (kFalse_SkTriState == state) {
+ return falseStr;
+ }
+ return NULL;
+}
+
void SampleWindow::updateTitle() {
SkString title;
@@ -1197,11 +1262,11 @@
if (fNClip) {
title.prepend("<C> ");
}
- if (LCDTextDrawFilter::kForceOn_Mode == fLCDMode) {
- title.prepend("LCD ");
- } else if (LCDTextDrawFilter::kForceOff_Mode == fLCDMode) {
- title.prepend("lcd ");
- }
+
+ title.prepend(trystate_str(fLCDState, "LCD ", "lcd "));
+ title.prepend(trystate_str(fAAState, "AA ", "aa "));
+ title.prepend(fFlipAxis & kFlipAxis_X ? "X " : NULL);
+ title.prepend(fFlipAxis & kFlipAxis_Y ? "Y " : NULL);
if (fZoomLevel) {
title.prependf("{%d} ", fZoomLevel);