diff options
| author | mike@reedtribe.org <mike@reedtribe.org@2bbb7eff-a529-9590-31e7-b0007b416f81> | 2011-03-21 00:53:39 +0000 |
|---|---|---|
| committer | mike@reedtribe.org <mike@reedtribe.org@2bbb7eff-a529-9590-31e7-b0007b416f81> | 2011-03-21 00:53:39 +0000 |
| commit | dd0cd34067d103ace7c6739405cb7885d8ad3fb2 (patch) | |
| tree | 24a05e759baa0cb06f96a6ad05aa56ba49f590c2 /samplecode/SampleApp.cpp | |
| parent | b7d956df4665e06f3ae98cb696cef7c04452ab8e (diff) | |
allow window-subclass to handle dispatching click events (for resize)
add drag tracking to Draw
git-svn-id: http://skia.googlecode.com/svn/trunk@967 2bbb7eff-a529-9590-31e7-b0007b416f81
Diffstat (limited to 'samplecode/SampleApp.cpp')
| -rw-r--r-- | samplecode/SampleApp.cpp | 78 |
1 files changed, 72 insertions, 6 deletions
diff --git a/samplecode/SampleApp.cpp b/samplecode/SampleApp.cpp index 3a7a1a6330..bb55da3634 100644 --- a/samplecode/SampleApp.cpp +++ b/samplecode/SampleApp.cpp @@ -13,6 +13,7 @@ #include "GrContext.h" #include "SkTouchGesture.h" +#define USE_ARROWS_FOR_ZOOM true //#define DEFAULT_TO_GPU extern SkView* create_overview(int, const SkViewFactory[]); @@ -122,6 +123,9 @@ LCDTextDrawFilter::Mode cycle_lcdmode(LCDTextDrawFilter::Mode mode) { ////////////////////////////////////////////////////////////////////////////// +#define MAX_ZOOM_LEVEL 8 +#define MIN_ZOOM_LEVEL -8 + static const char gCharEvtName[] = "SampleCode_Char_Event"; static const char gKeyEvtName[] = "SampleCode_Key_Event"; static const char gTitleEvtName[] = "SampleCode_Title_Event"; @@ -225,6 +229,7 @@ protected: virtual bool onEvent(const SkEvent& evt); virtual bool onQuery(SkEvent* evt); + virtual bool onDispatchClick(int x, int y, Click::State); virtual bool onClick(Click* click); virtual Click* onFindClickHandler(SkScalar x, SkScalar y); @@ -233,9 +238,6 @@ protected: virtual bool handleEvent(const SkEvent& evt); virtual bool handleKey(SkKey key); virtual bool handleKeyUp(SkKey key); - - virtual bool onClick(Click* click); - virtual Click* onFindClickHandler(SkScalar x, SkScalar y); virtual bool onHandleKeyUp(SkKey key); #endif @@ -248,6 +250,8 @@ private: SkPath fClipPath; SkTouchGesture fGesture; + int fZoomLevel; + SkScalar fZoomScale; enum CanvasType { kRaster_CanvasType, @@ -269,6 +273,7 @@ private: int fScrollTestX, fScrollTestY; bool make3DReady(); + void changeZoomLevel(int delta); void loadView(SkView*); void updateTitle(); @@ -340,6 +345,9 @@ SampleWindow::SampleWindow(void* hwnd) : INHERITED(hwnd) { fLCDMode = LCDTextDrawFilter::kNeutral_Mode; fScrollTestX = fScrollTestY = 0; + fZoomLevel = 0; + fZoomScale = SK_Scalar1; + // this->setConfig(SkBitmap::kRGB_565_Config); this->setConfig(SkBitmap::kARGB_8888_Config); this->setVisibleP(true); @@ -401,6 +409,23 @@ void SampleWindow::draw(SkCanvas* canvas) { gAnimTimePrev = gAnimTime; gAnimTime = SkTime::GetMSecs(); + 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); + cx = center.fX; + cy = center.fY; + + m.setTranslate(-cx, -cy); + m.postScale(fZoomScale, fZoomScale); + m.postTranslate(cx, cy); + + canvas->concat(m); + } + // Apply any gesture matrix if (true) { const SkMatrix& localM = fGesture.localM(); @@ -506,6 +531,8 @@ SkCanvas* SampleWindow::beforeChildren(SkCanvas* canvas) { bitmap.width(), bitmap.height(), false, false); fGpuCanvas->setDevice(device)->unref(); + + fGpuCanvas->concat(canvas->getTotalMatrix()); canvas = fGpuCanvas; } else { @@ -640,6 +667,21 @@ static SkBitmap::Config cycle_configs(SkBitmap::Config c) { return gConfigCycle[c]; } +void SampleWindow::changeZoomLevel(int delta) { + fZoomLevel += delta; + if (fZoomLevel > 0) { + fZoomLevel = SkMin32(fZoomLevel, MAX_ZOOM_LEVEL); + fZoomScale = SkIntToScalar(fZoomLevel + 1); + } else if (fZoomLevel < 0) { + fZoomLevel = SkMax32(fZoomLevel, MIN_ZOOM_LEVEL); + fZoomScale = SK_Scalar1 / (1 - fZoomLevel); + } else { + fZoomScale = SK_Scalar1; + } + + this->inval(NULL); +} + bool SampleWindow::nextSample() { fCurrIndex = (fCurrIndex + 1) % fSamples.count(); this->loadView(fSamples[fCurrIndex]()); @@ -816,12 +858,20 @@ bool SampleWindow::onHandleKey(SkKey key) { this->inval(NULL); return true; case kUp_SkKey: - fNClip = !fNClip; + if (USE_ARROWS_FOR_ZOOM) { + this->changeZoomLevel(1); + } else { + fNClip = !fNClip; + this->inval(NULL); + } this->updateTitle(); - this->inval(NULL); return true; case kDown_SkKey: - this->setConfig(cycle_configs(this->getBitmap().config())); + if (USE_ARROWS_FOR_ZOOM) { + this->changeZoomLevel(-1); + } else { + this->setConfig(cycle_configs(this->getBitmap().config())); + } this->updateTitle(); return true; case kOK_SkKey: @@ -849,6 +899,18 @@ bool SampleWindow::onHandleKey(SkKey key) { static const char gGestureClickType[] = "GestureClickType"; +bool SampleWindow::onDispatchClick(int x, int y, Click::State state) { + int w = SkScalarRound(this->width()); + int h = SkScalarRound(this->height()); + + // check for the resize-box + if (w - x < 16 && h - y < 16) { + return false; // let the OS handle the click + } else { + return this->INHERITED::onDispatchClick(x, y, state); + } +} + class GestureClick : public SkView::Click { public: GestureClick(SkView* target) : SkView::Click(target) { @@ -961,6 +1023,10 @@ void SampleWindow::updateTitle() { } else if (LCDTextDrawFilter::kForceOff_Mode == fLCDMode) { title.prepend("lcd "); } + + if (fZoomLevel) { + title.prependf("{%d} ", fZoomLevel); + } this->setTitle(title.c_str()); } |
