SampleApp.cpp revision 4aebe4fb10ebdfe81192f46906ca53cf6033a467
18a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkCanvas.h"
28a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkDevice.h"
3ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com#include "SkGpuCanvas.h"
48a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkGraphics.h"
5b08eb2b3bce45411494fe00258e4c91248ccd15ereed@android.com#include "SkImageEncoder.h"
68a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkPaint.h"
78a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkPicture.h"
88a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkStream.h"
94417740a480786ca65379ba5b398c500ba34ee18reed@android.com#include "SkTime.h"
108a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkWindow.h"
118a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
128a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SampleCode.h"
13ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com#include "GrContext.h"
1452f57e1d11a00bdc5efb96709446546cdbc1ff9dreed@google.com#include "SkTouchGesture.h"
150f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo#include "SkTypeface.h"
16f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com
17dd0cd34067d103ace7c6739405cb7885d8ad3fb2mike@reedtribe.org#define USE_ARROWS_FOR_ZOOM true
18f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com//#define DEFAULT_TO_GPU
19f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com
20e191b16fda2f5afea3a90653c1cd4f5a3c436e89reed@android.comextern SkView* create_overview(int, const SkViewFactory[]);
2134245c7871f6339de8cc2be8fb1090ca3cba54efreed@android.com
22cb34235f46b6259b612e72c416e850e26803250areed@android.com#define SK_SUPPORT_GL
238a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
248a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#define ANIMATING_EVENTTYPE "nextSample"
258a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#define ANIMATING_DELAY     750
268a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
272eb595292b9624371d1698ae9da7accb4c09c26cmike@reedtribe.org#ifdef SK_DEBUG
282eb595292b9624371d1698ae9da7accb4c09c26cmike@reedtribe.org    #define FPS_REPEAT_COUNT    10
292eb595292b9624371d1698ae9da7accb4c09c26cmike@reedtribe.org#else
302eb595292b9624371d1698ae9da7accb4c09c26cmike@reedtribe.org    #define FPS_REPEAT_COUNT    100
312eb595292b9624371d1698ae9da7accb4c09c26cmike@reedtribe.org#endif
322eb595292b9624371d1698ae9da7accb4c09c26cmike@reedtribe.org
33ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com#ifdef SK_SUPPORT_GL
34ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com    #include "GrGLConfig.h"
35ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com#endif
36ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com
372eb595292b9624371d1698ae9da7accb4c09c26cmike@reedtribe.org///////////////
382eb595292b9624371d1698ae9da7accb4c09c26cmike@reedtribe.orgstatic const char view_inval_msg[] = "view-inval-msg";
392eb595292b9624371d1698ae9da7accb4c09c26cmike@reedtribe.org
402eb595292b9624371d1698ae9da7accb4c09c26cmike@reedtribe.orgstatic void postInvalDelay(SkEventSinkID sinkID) {
412eb595292b9624371d1698ae9da7accb4c09c26cmike@reedtribe.org    SkEvent* evt = new SkEvent(view_inval_msg);
42f21833999d90ad9c8c584cff3238797b39cfc00breed@google.com    evt->post(sinkID, 1);
432eb595292b9624371d1698ae9da7accb4c09c26cmike@reedtribe.org}
442eb595292b9624371d1698ae9da7accb4c09c26cmike@reedtribe.org
452eb595292b9624371d1698ae9da7accb4c09c26cmike@reedtribe.orgstatic bool isInvalEvent(const SkEvent& evt) {
462eb595292b9624371d1698ae9da7accb4c09c26cmike@reedtribe.org    return evt.isType(view_inval_msg);
472eb595292b9624371d1698ae9da7accb4c09c26cmike@reedtribe.org}
482eb595292b9624371d1698ae9da7accb4c09c26cmike@reedtribe.org//////////////////
492eb595292b9624371d1698ae9da7accb4c09c26cmike@reedtribe.org
508a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comSkViewRegister* SkViewRegister::gHead;
518a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comSkViewRegister::SkViewRegister(SkViewFactory fact) : fFact(fact) {
528a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    static bool gOnce;
538a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    if (!gOnce) {
548a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        gHead = NULL;
558a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        gOnce = true;
568a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    }
572e7b43d33cc495663cb814a7a9d1ecdc09c31828bsalomon@google.com
588a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    fChain = gHead;
598a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    gHead = this;
608a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
618a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
62f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com#if defined(SK_SUPPORT_GL)
63f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com    #define SK_USE_SHADERS
648a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#endif
658a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
6606c3b6bfd53c93d5ba49cf4d87b2c5c1bf33f072twiz@google.com#ifdef SK_BUILD_FOR_MAC
67f0b5f68807cfa18cce0647d275778147901945cdreed@google.com#include <CoreFoundation/CoreFoundation.h>
68f0b5f68807cfa18cce0647d275778147901945cdreed@google.com#include <CoreFoundation/CFURLAccess.h>
69f0b5f68807cfa18cce0647d275778147901945cdreed@google.com
70f0b5f68807cfa18cce0647d275778147901945cdreed@google.comstatic void testpdf() {
71f0b5f68807cfa18cce0647d275778147901945cdreed@google.com    CFStringRef path = CFStringCreateWithCString(NULL, "/test.pdf",
72f0b5f68807cfa18cce0647d275778147901945cdreed@google.com                                                 kCFStringEncodingUTF8);
73f0b5f68807cfa18cce0647d275778147901945cdreed@google.com    CFURLRef url = CFURLCreateWithFileSystemPath(NULL, path,
74f0b5f68807cfa18cce0647d275778147901945cdreed@google.com                                              kCFURLPOSIXPathStyle,
75f0b5f68807cfa18cce0647d275778147901945cdreed@google.com                                              false);
76f0b5f68807cfa18cce0647d275778147901945cdreed@google.com    CFRelease(path);
77f0b5f68807cfa18cce0647d275778147901945cdreed@google.com    CGRect box = CGRectMake(0, 0, 8*72, 10*72);
78f0b5f68807cfa18cce0647d275778147901945cdreed@google.com    CGContextRef cg = CGPDFContextCreateWithURL(url, &box, NULL);
79f0b5f68807cfa18cce0647d275778147901945cdreed@google.com    CFRelease(url);
80f0b5f68807cfa18cce0647d275778147901945cdreed@google.com
81f0b5f68807cfa18cce0647d275778147901945cdreed@google.com    CGContextBeginPage(cg, &box);
82f0b5f68807cfa18cce0647d275778147901945cdreed@google.com    CGRect r = CGRectMake(10, 10, 40 + 0.5, 50 + 0.5);
83f0b5f68807cfa18cce0647d275778147901945cdreed@google.com    CGContextFillEllipseInRect(cg, r);
84f0b5f68807cfa18cce0647d275778147901945cdreed@google.com    CGContextEndPage(cg);
85f0b5f68807cfa18cce0647d275778147901945cdreed@google.com    CGContextRelease(cg);
86f0b5f68807cfa18cce0647d275778147901945cdreed@google.com
87f0b5f68807cfa18cce0647d275778147901945cdreed@google.com    if (false) {
88f0b5f68807cfa18cce0647d275778147901945cdreed@google.com        SkBitmap bm;
89f0b5f68807cfa18cce0647d275778147901945cdreed@google.com        bm.setConfig(SkBitmap::kA8_Config, 64, 64);
90f0b5f68807cfa18cce0647d275778147901945cdreed@google.com        bm.allocPixels();
91f0b5f68807cfa18cce0647d275778147901945cdreed@google.com        bm.eraseColor(0);
92f0b5f68807cfa18cce0647d275778147901945cdreed@google.com
93f0b5f68807cfa18cce0647d275778147901945cdreed@google.com        SkCanvas canvas(bm);
94f0b5f68807cfa18cce0647d275778147901945cdreed@google.com
95f0b5f68807cfa18cce0647d275778147901945cdreed@google.com    }
96f0b5f68807cfa18cce0647d275778147901945cdreed@google.com}
97f0b5f68807cfa18cce0647d275778147901945cdreed@google.com#endif
98f0b5f68807cfa18cce0647d275778147901945cdreed@google.com
99f0b5f68807cfa18cce0647d275778147901945cdreed@google.com//////////////////////////////////////////////////////////////////////////////
100f0b5f68807cfa18cce0647d275778147901945cdreed@google.com
101569e0435af62bdb88a662fa0592f75673a17afd9reed@google.comenum FlipAxisEnum {
102569e0435af62bdb88a662fa0592f75673a17afd9reed@google.com    kFlipAxis_X = (1 << 0),
103569e0435af62bdb88a662fa0592f75673a17afd9reed@google.com    kFlipAxis_Y = (1 << 1)
104569e0435af62bdb88a662fa0592f75673a17afd9reed@google.com};
105f0b5f68807cfa18cce0647d275778147901945cdreed@google.com
106569e0435af62bdb88a662fa0592f75673a17afd9reed@google.comenum SkTriState {
107569e0435af62bdb88a662fa0592f75673a17afd9reed@google.com    kFalse_SkTriState,
108569e0435af62bdb88a662fa0592f75673a17afd9reed@google.com    kTrue_SkTriState,
109569e0435af62bdb88a662fa0592f75673a17afd9reed@google.com    kUnknown_SkTriState,
110569e0435af62bdb88a662fa0592f75673a17afd9reed@google.com};
111569e0435af62bdb88a662fa0592f75673a17afd9reed@google.com
112569e0435af62bdb88a662fa0592f75673a17afd9reed@google.comstatic SkTriState cycle_tristate(SkTriState state) {
113569e0435af62bdb88a662fa0592f75673a17afd9reed@google.com    static const SkTriState gCycle[] = {
114569e0435af62bdb88a662fa0592f75673a17afd9reed@google.com        /* kFalse_SkTriState   -> */  kUnknown_SkTriState,
115569e0435af62bdb88a662fa0592f75673a17afd9reed@google.com        /* kTrue_SkTriState    -> */  kFalse_SkTriState,
116569e0435af62bdb88a662fa0592f75673a17afd9reed@google.com        /* kUnknown_SkTriState -> */  kTrue_SkTriState,
117f0b5f68807cfa18cce0647d275778147901945cdreed@google.com    };
118569e0435af62bdb88a662fa0592f75673a17afd9reed@google.com    return gCycle[state];
119569e0435af62bdb88a662fa0592f75673a17afd9reed@google.com}
120f0b5f68807cfa18cce0647d275778147901945cdreed@google.com
121569e0435af62bdb88a662fa0592f75673a17afd9reed@google.com#include "SkDrawFilter.h"
122569e0435af62bdb88a662fa0592f75673a17afd9reed@google.com
123569e0435af62bdb88a662fa0592f75673a17afd9reed@google.comclass FlagsDrawFilter : public SkDrawFilter {
124569e0435af62bdb88a662fa0592f75673a17afd9reed@google.compublic:
125569e0435af62bdb88a662fa0592f75673a17afd9reed@google.com    FlagsDrawFilter(SkTriState lcd, SkTriState aa) : fLCDState(lcd), fAAState(aa) {}
126f0b5f68807cfa18cce0647d275778147901945cdreed@google.com
1273ce59dc4999de5d6c6913af662c8b0b8020a4ef7mike@reedtribe.org    virtual void filter(SkPaint* paint, Type t) {
128569e0435af62bdb88a662fa0592f75673a17afd9reed@google.com        if (kText_Type == t && kUnknown_SkTriState != fLCDState) {
129569e0435af62bdb88a662fa0592f75673a17afd9reed@google.com            paint->setLCDRenderText(kTrue_SkTriState == fLCDState);
130569e0435af62bdb88a662fa0592f75673a17afd9reed@google.com        }
131569e0435af62bdb88a662fa0592f75673a17afd9reed@google.com        if (kUnknown_SkTriState != fAAState) {
132569e0435af62bdb88a662fa0592f75673a17afd9reed@google.com            paint->setAntiAlias(kTrue_SkTriState == fAAState);
133f0b5f68807cfa18cce0647d275778147901945cdreed@google.com        }
134f0b5f68807cfa18cce0647d275778147901945cdreed@google.com    }
135f0b5f68807cfa18cce0647d275778147901945cdreed@google.com
136f0b5f68807cfa18cce0647d275778147901945cdreed@google.comprivate:
137569e0435af62bdb88a662fa0592f75673a17afd9reed@google.com    SkTriState  fLCDState;
138569e0435af62bdb88a662fa0592f75673a17afd9reed@google.com    SkTriState  fAAState;
139f0b5f68807cfa18cce0647d275778147901945cdreed@google.com};
140f0b5f68807cfa18cce0647d275778147901945cdreed@google.com
1418a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com//////////////////////////////////////////////////////////////////////////////
1428a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
143dd0cd34067d103ace7c6739405cb7885d8ad3fb2mike@reedtribe.org#define MAX_ZOOM_LEVEL  8
144dd0cd34067d103ace7c6739405cb7885d8ad3fb2mike@reedtribe.org#define MIN_ZOOM_LEVEL  -8
145dd0cd34067d103ace7c6739405cb7885d8ad3fb2mike@reedtribe.org
146f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.comstatic const char gCharEvtName[] = "SampleCode_Char_Event";
147f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.comstatic const char gKeyEvtName[] = "SampleCode_Key_Event";
1488a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comstatic const char gTitleEvtName[] = "SampleCode_Title_Event";
1498a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comstatic const char gPrefSizeEvtName[] = "SampleCode_PrefSize_Event";
150f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.comstatic const char gFastTextEvtName[] = "SampleCode_FastText_Event";
151f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com
152f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.combool SampleCode::CharQ(const SkEvent& evt, SkUnichar* outUni) {
153f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com    if (evt.isType(gCharEvtName, sizeof(gCharEvtName) - 1)) {
154f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com        if (outUni) {
155f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com            *outUni = evt.getFast32();
156f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com        }
157f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com        return true;
158f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com    }
159f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com    return false;
160f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com}
161f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com
162f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.combool SampleCode::KeyQ(const SkEvent& evt, SkKey* outKey) {
163f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com    if (evt.isType(gKeyEvtName, sizeof(gKeyEvtName) - 1)) {
164f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com        if (outKey) {
165f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com            *outKey = (SkKey)evt.getFast32();
166f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com        }
167f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com        return true;
168f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com    }
169f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com    return false;
170f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com}
1718a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1728a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.combool SampleCode::TitleQ(const SkEvent& evt) {
1738a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    return evt.isType(gTitleEvtName, sizeof(gTitleEvtName) - 1);
1748a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
1758a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1768a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comvoid SampleCode::TitleR(SkEvent* evt, const char title[]) {
1778a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkASSERT(evt && TitleQ(*evt));
1788a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    evt->setString(gTitleEvtName, title);
1798a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
1808a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1818a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.combool SampleCode::PrefSizeQ(const SkEvent& evt) {
1828a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    return evt.isType(gPrefSizeEvtName, sizeof(gPrefSizeEvtName) - 1);
1838a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
1848a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1858a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comvoid SampleCode::PrefSizeR(SkEvent* evt, SkScalar width, SkScalar height) {
1868a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkASSERT(evt && PrefSizeQ(*evt));
1878a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkScalar size[2];
1888a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    size[0] = width;
1898a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    size[1] = height;
1908a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    evt->setScalars(gPrefSizeEvtName, 2, size);
1918a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
1928a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
193f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.combool SampleCode::FastTextQ(const SkEvent& evt) {
194f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com    return evt.isType(gFastTextEvtName, sizeof(gFastTextEvtName) - 1);
195f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com}
196f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com
197f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com///////////////////////////////////////////////////////////////////////////////
198f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com
1994417740a480786ca65379ba5b398c500ba34ee18reed@android.comstatic SkMSec gAnimTime;
200f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.comstatic SkMSec gAnimTimePrev;
201f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com
2024417740a480786ca65379ba5b398c500ba34ee18reed@android.comSkMSec SampleCode::GetAnimTime() { return gAnimTime; }
203f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.comSkMSec SampleCode::GetAnimTimeDelta() { return gAnimTime - gAnimTimePrev; }
204f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.comSkScalar SampleCode::GetAnimSecondsDelta() {
205f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com    return SkDoubleToScalar(GetAnimTimeDelta() / 1000.0);
206f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com}
2074417740a480786ca65379ba5b398c500ba34ee18reed@android.com
2084417740a480786ca65379ba5b398c500ba34ee18reed@android.comSkScalar SampleCode::GetAnimScalar(SkScalar speed, SkScalar period) {
209f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com    // since gAnimTime can be up to 32 bits, we can't convert it to a float
210f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com    // or we'll lose the low bits. Hence we use doubles for the intermediate
211f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com    // calculations
212f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com    double seconds = (double)gAnimTime / 1000.0;
213f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com    double value = SkScalarToDouble(speed) * seconds;
2144417740a480786ca65379ba5b398c500ba34ee18reed@android.com    if (period) {
215f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com        value = ::fmod(value, SkScalarToDouble(period));
2164417740a480786ca65379ba5b398c500ba34ee18reed@android.com    }
217f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com    return SkDoubleToScalar(value);
2184417740a480786ca65379ba5b398c500ba34ee18reed@android.com}
2194417740a480786ca65379ba5b398c500ba34ee18reed@android.com
2208a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com//////////////////////////////////////////////////////////////////////////////
2218a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
222f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.comstatic SkView* curr_view(SkWindow* wind) {
223f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com    SkView::F2BIter iter(wind);
224f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com    return iter.next();
225f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com}
226f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com
2278a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comclass SampleWindow : public SkOSWindow {
22834245c7871f6339de8cc2be8fb1090ca3cba54efreed@android.com    SkTDArray<SkViewFactory> fSamples;
2298a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.compublic:
2302fbc7fa460c99bffa78b9afb9aaa4dc0db68e1babsalomon@google.com    SampleWindow(void* hwnd);
2312fbc7fa460c99bffa78b9afb9aaa4dc0db68e1babsalomon@google.com    virtual ~SampleWindow();
2328a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
233e522ca5d5f249bd51a00cb68bb051f811d0a9e85reed@android.com    virtual void draw(SkCanvas* canvas);
234e522ca5d5f249bd51a00cb68bb051f811d0a9e85reed@android.com
2358a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comprotected:
2368a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    virtual void onDraw(SkCanvas* canvas);
2372fbc7fa460c99bffa78b9afb9aaa4dc0db68e1babsalomon@google.com    virtual bool onHandleKey(SkKey key);
2388a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    virtual bool onHandleChar(SkUnichar);
2398a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    virtual void onSizeChange();
2402e7b43d33cc495663cb814a7a9d1ecdc09c31828bsalomon@google.com
2418a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    virtual SkCanvas* beforeChildren(SkCanvas*);
2428a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    virtual void afterChildren(SkCanvas*);
2436c5f6f25b43f1210decb48956c1a2fbe5b58f889reed@android.com    virtual void beforeChild(SkView* child, SkCanvas* canvas);
2446c5f6f25b43f1210decb48956c1a2fbe5b58f889reed@android.com    virtual void afterChild(SkView* child, SkCanvas* canvas);
2452e7b43d33cc495663cb814a7a9d1ecdc09c31828bsalomon@google.com
2462fbc7fa460c99bffa78b9afb9aaa4dc0db68e1babsalomon@google.com    virtual bool onEvent(const SkEvent& evt);
247f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com    virtual bool onQuery(SkEvent* evt);
2488a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
249dd0cd34067d103ace7c6739405cb7885d8ad3fb2mike@reedtribe.org    virtual bool onDispatchClick(int x, int y, Click::State);
25052f57e1d11a00bdc5efb96709446546cdbc1ff9dreed@google.com    virtual bool onClick(Click* click);
25152f57e1d11a00bdc5efb96709446546cdbc1ff9dreed@google.com    virtual Click* onFindClickHandler(SkScalar x, SkScalar y);
25252f57e1d11a00bdc5efb96709446546cdbc1ff9dreed@google.com
2538a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#if 0
2542fbc7fa460c99bffa78b9afb9aaa4dc0db68e1babsalomon@google.com    virtual bool handleChar(SkUnichar uni);
2552fbc7fa460c99bffa78b9afb9aaa4dc0db68e1babsalomon@google.com    virtual bool handleEvent(const SkEvent& evt);
2562fbc7fa460c99bffa78b9afb9aaa4dc0db68e1babsalomon@google.com    virtual bool handleKey(SkKey key);
2572fbc7fa460c99bffa78b9afb9aaa4dc0db68e1babsalomon@google.com    virtual bool handleKeyUp(SkKey key);
2588a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    virtual bool onHandleKeyUp(SkKey key);
2598a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#endif
2602e7b43d33cc495663cb814a7a9d1ecdc09c31828bsalomon@google.com
2618a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comprivate:
26234245c7871f6339de8cc2be8fb1090ca3cba54efreed@android.com    int fCurrIndex;
2632e7b43d33cc495663cb814a7a9d1ecdc09c31828bsalomon@google.com
2648a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkPicture* fPicture;
265f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com    SkGpuCanvas* fGpuCanvas;
2662e7b43d33cc495663cb814a7a9d1ecdc09c31828bsalomon@google.com    GrContext* fGrContext;
2678a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkPath fClipPath;
2682e7b43d33cc495663cb814a7a9d1ecdc09c31828bsalomon@google.com
26952f57e1d11a00bdc5efb96709446546cdbc1ff9dreed@google.com    SkTouchGesture fGesture;
270dd0cd34067d103ace7c6739405cb7885d8ad3fb2mike@reedtribe.org    int      fZoomLevel;
271dd0cd34067d103ace7c6739405cb7885d8ad3fb2mike@reedtribe.org    SkScalar fZoomScale;
27252f57e1d11a00bdc5efb96709446546cdbc1ff9dreed@google.com
2738a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    enum CanvasType {
2748a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        kRaster_CanvasType,
2758a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        kPicture_CanvasType,
276f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com        kGPU_CanvasType
2778a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    };
2788a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    CanvasType fCanvasType;
2798a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
2808a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    bool fUseClip;
281e522ca5d5f249bd51a00cb68bb051f811d0a9e85reed@android.com    bool fNClip;
2828a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    bool fRepeatDrawing;
2838a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    bool fAnimating;
2846c5f6f25b43f1210decb48956c1a2fbe5b58f889reed@android.com    bool fRotate;
2856c5f6f25b43f1210decb48956c1a2fbe5b58f889reed@android.com    bool fScale;
286f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com    bool fRequestGrabImage;
2872eb595292b9624371d1698ae9da7accb4c09c26cmike@reedtribe.org    bool fMeasureFPS;
2882eb595292b9624371d1698ae9da7accb4c09c26cmike@reedtribe.org    SkMSec fMeasureFPS_Time;
2892e7b43d33cc495663cb814a7a9d1ecdc09c31828bsalomon@google.com
2900f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo    // The following are for the 'fatbits' drawing
2910f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo    // Latest position of the mouse.
2920f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo    int fMouseX, fMouseY;
2930f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo    int fFatBitsScale;
2940f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo    // Used by the text showing position and color values.
2950f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo    SkTypeface* fTypeface;
2960f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo    bool fShowZoomer;
2970f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo
298569e0435af62bdb88a662fa0592f75673a17afd9reed@google.com    SkTriState fLCDState;
299569e0435af62bdb88a662fa0592f75673a17afd9reed@google.com    SkTriState fAAState;
300569e0435af62bdb88a662fa0592f75673a17afd9reed@google.com    unsigned   fFlipAxis;
301f0b5f68807cfa18cce0647d275778147901945cdreed@google.com
3028a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    int fScrollTestX, fScrollTestY;
3032e7b43d33cc495663cb814a7a9d1ecdc09c31828bsalomon@google.com
3042e7b43d33cc495663cb814a7a9d1ecdc09c31828bsalomon@google.com    bool make3DReady();
305dd0cd34067d103ace7c6739405cb7885d8ad3fb2mike@reedtribe.org    void changeZoomLevel(int delta);
3062e7b43d33cc495663cb814a7a9d1ecdc09c31828bsalomon@google.com
3078a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    void loadView(SkView*);
3088a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    void updateTitle();
3098a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    bool nextSample();
3108a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
3110f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo    void toggleZoomer();
3120f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo    bool zoomIn();
3130f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo    bool zoomOut();
3140f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo    void updatePointer(int x, int y);
3150f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo
3168a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    void postAnimatingEvent() {
3178a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        if (fAnimating) {
3188a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            SkEvent* evt = new SkEvent(ANIMATING_EVENTTYPE);
3198a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            evt->post(this->getSinkID(), ANIMATING_DELAY);
3208a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        }
3218a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    }
3222e7b43d33cc495663cb814a7a9d1ecdc09c31828bsalomon@google.com
3232e7b43d33cc495663cb814a7a9d1ecdc09c31828bsalomon@google.com
3248a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    static CanvasType cycle_canvastype(CanvasType);
3258a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
3268a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    typedef SkOSWindow INHERITED;
3278a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com};
3288a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
3290f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggobool SampleWindow::zoomIn()
3300f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo{
3310f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo    // Arbitrarily decided
3320f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo    if (fFatBitsScale == 25) return false;
3330f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo    fFatBitsScale++;
3340f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo    this->inval(NULL);
3350f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo    return true;
3360f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo}
3370f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo
3380f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggobool SampleWindow::zoomOut()
3390f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo{
3400f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo    if (fFatBitsScale == 1) return false;
3410f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo    fFatBitsScale--;
3420f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo    this->inval(NULL);
3430f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo    return true;
3440f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo}
3450f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo
3460f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggovoid SampleWindow::toggleZoomer()
3470f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo{
3480f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo    fShowZoomer = !fShowZoomer;
3490f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo    this->inval(NULL);
3500f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo}
3510f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo
3520f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggovoid SampleWindow::updatePointer(int x, int y)
3530f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo{
3540f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo    fMouseX = x;
3550f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo    fMouseY = y;
3560f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo    if (fShowZoomer) {
3570f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo        this->inval(NULL);
3580f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo    }
3590f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo}
3600f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo
3612e7b43d33cc495663cb814a7a9d1ecdc09c31828bsalomon@google.combool SampleWindow::make3DReady() {
3622e7b43d33cc495663cb814a7a9d1ecdc09c31828bsalomon@google.com
3632e7b43d33cc495663cb814a7a9d1ecdc09c31828bsalomon@google.com#if defined(SK_SUPPORT_GL)
364498a623e2eacb709c23e5c5be6d4991ad83ab167bsalomon@google.com    if (attachGL()) {
36511f0b519766dabed4ce882f3ee7c07a68d3ccb52bsalomon@google.com        if (NULL != fGrContext) {
3668fe72477f204b1a45393e6a64caa84fd287b805bbsalomon@google.com        // various gr lifecycle tests
3678fe72477f204b1a45393e6a64caa84fd287b805bbsalomon@google.com        #if   0
3688fe72477f204b1a45393e6a64caa84fd287b805bbsalomon@google.com            fGrContext->freeGpuResources();
3698fe72477f204b1a45393e6a64caa84fd287b805bbsalomon@google.com        #elif 0
3708fe72477f204b1a45393e6a64caa84fd287b805bbsalomon@google.com            // this will leak resources.
3718fe72477f204b1a45393e6a64caa84fd287b805bbsalomon@google.com            fGrContext->contextLost();
3728fe72477f204b1a45393e6a64caa84fd287b805bbsalomon@google.com        #elif 0
37311f0b519766dabed4ce882f3ee7c07a68d3ccb52bsalomon@google.com            GrAssert(1 == fGrContext->refcnt());
37411f0b519766dabed4ce882f3ee7c07a68d3ccb52bsalomon@google.com            fGrContext->unref();
37511f0b519766dabed4ce882f3ee7c07a68d3ccb52bsalomon@google.com            fGrContext = NULL;
3768fe72477f204b1a45393e6a64caa84fd287b805bbsalomon@google.com        #endif
37711f0b519766dabed4ce882f3ee7c07a68d3ccb52bsalomon@google.com        }
3788fe72477f204b1a45393e6a64caa84fd287b805bbsalomon@google.com
379498a623e2eacb709c23e5c5be6d4991ad83ab167bsalomon@google.com        if (NULL == fGrContext) {
380498a623e2eacb709c23e5c5be6d4991ad83ab167bsalomon@google.com        #if defined(SK_USE_SHADERS)
38105ef510389950e1ae8dcba40e41e001db771b12dbsalomon@google.com            fGrContext = GrContext::Create(kOpenGL_Shaders_GrEngine, NULL);
382498a623e2eacb709c23e5c5be6d4991ad83ab167bsalomon@google.com        #else
38305ef510389950e1ae8dcba40e41e001db771b12dbsalomon@google.com            fGrContext = GrContext::Create(kOpenGL_Fixed_GrEngine, NULL);
384498a623e2eacb709c23e5c5be6d4991ad83ab167bsalomon@google.com        #endif
385569e0435af62bdb88a662fa0592f75673a17afd9reed@google.com            SkDebugf("---- constructor\n");
386498a623e2eacb709c23e5c5be6d4991ad83ab167bsalomon@google.com        }
3872e7b43d33cc495663cb814a7a9d1ecdc09c31828bsalomon@google.com
388498a623e2eacb709c23e5c5be6d4991ad83ab167bsalomon@google.com        if (NULL != fGrContext) {
389498a623e2eacb709c23e5c5be6d4991ad83ab167bsalomon@google.com            return true;
390498a623e2eacb709c23e5c5be6d4991ad83ab167bsalomon@google.com        } else {
391498a623e2eacb709c23e5c5be6d4991ad83ab167bsalomon@google.com            detachGL();
392498a623e2eacb709c23e5c5be6d4991ad83ab167bsalomon@google.com        }
3932e7b43d33cc495663cb814a7a9d1ecdc09c31828bsalomon@google.com    }
3942e7b43d33cc495663cb814a7a9d1ecdc09c31828bsalomon@google.com#endif
3952e7b43d33cc495663cb814a7a9d1ecdc09c31828bsalomon@google.com    SkDebugf("Failed to setup 3D");
3962e7b43d33cc495663cb814a7a9d1ecdc09c31828bsalomon@google.com    return false;
3972e7b43d33cc495663cb814a7a9d1ecdc09c31828bsalomon@google.com}
3982e7b43d33cc495663cb814a7a9d1ecdc09c31828bsalomon@google.com
3998a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comSampleWindow::CanvasType SampleWindow::cycle_canvastype(CanvasType ct) {
4008a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    static const CanvasType gCT[] = {
4018a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        kPicture_CanvasType,
402f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com        kGPU_CanvasType,
4038a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        kRaster_CanvasType
4048a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    };
4058a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    return gCT[ct];
4068a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
4078a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
4088a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comSampleWindow::SampleWindow(void* hwnd) : INHERITED(hwnd) {
4098a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    fPicture = NULL;
410f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com    fGpuCanvas = NULL;
4118a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
4122e7b43d33cc495663cb814a7a9d1ecdc09c31828bsalomon@google.com    fGrContext = NULL;
4132e7b43d33cc495663cb814a7a9d1ecdc09c31828bsalomon@google.com
414f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com#ifdef DEFAULT_TO_GPU
415f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com    fCanvasType = kGPU_CanvasType;
416f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com#else
4178a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    fCanvasType = kRaster_CanvasType;
418f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com#endif
4198a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    fUseClip = false;
420e522ca5d5f249bd51a00cb68bb051f811d0a9e85reed@android.com    fNClip = false;
4218a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    fRepeatDrawing = false;
4228a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    fAnimating = false;
4236c5f6f25b43f1210decb48956c1a2fbe5b58f889reed@android.com    fRotate = false;
4246c5f6f25b43f1210decb48956c1a2fbe5b58f889reed@android.com    fScale = false;
425f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com    fRequestGrabImage = false;
4262eb595292b9624371d1698ae9da7accb4c09c26cmike@reedtribe.org    fMeasureFPS = false;
427569e0435af62bdb88a662fa0592f75673a17afd9reed@google.com    fLCDState = kUnknown_SkTriState;
428569e0435af62bdb88a662fa0592f75673a17afd9reed@google.com    fAAState = kUnknown_SkTriState;
429569e0435af62bdb88a662fa0592f75673a17afd9reed@google.com    fFlipAxis = 0;
4308a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    fScrollTestX = fScrollTestY = 0;
4318a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
4320f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo    fMouseX = fMouseY = 0;
4333ce59dc4999de5d6c6913af662c8b0b8020a4ef7mike@reedtribe.org    fFatBitsScale = 8;
4340f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo    fTypeface = SkTypeface::CreateFromTypeface(NULL, SkTypeface::kBold);
4350f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo    fShowZoomer = false;
4360f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo
437dd0cd34067d103ace7c6739405cb7885d8ad3fb2mike@reedtribe.org    fZoomLevel = 0;
438dd0cd34067d103ace7c6739405cb7885d8ad3fb2mike@reedtribe.org    fZoomScale = SK_Scalar1;
439dd0cd34067d103ace7c6739405cb7885d8ad3fb2mike@reedtribe.org
4402fbc7fa460c99bffa78b9afb9aaa4dc0db68e1babsalomon@google.com//    this->setConfig(SkBitmap::kRGB_565_Config);
4412fbc7fa460c99bffa78b9afb9aaa4dc0db68e1babsalomon@google.com    this->setConfig(SkBitmap::kARGB_8888_Config);
4422fbc7fa460c99bffa78b9afb9aaa4dc0db68e1babsalomon@google.com    this->setVisibleP(true);
443f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com    this->setClipToBounds(false);
4448a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
44534245c7871f6339de8cc2be8fb1090ca3cba54efreed@android.com    {
44634245c7871f6339de8cc2be8fb1090ca3cba54efreed@android.com        const SkViewRegister* reg = SkViewRegister::Head();
44734245c7871f6339de8cc2be8fb1090ca3cba54efreed@android.com        while (reg) {
44834245c7871f6339de8cc2be8fb1090ca3cba54efreed@android.com            *fSamples.append() = reg->factory();
44934245c7871f6339de8cc2be8fb1090ca3cba54efreed@android.com            reg = reg->next();
45034245c7871f6339de8cc2be8fb1090ca3cba54efreed@android.com        }
45134245c7871f6339de8cc2be8fb1090ca3cba54efreed@android.com    }
45234245c7871f6339de8cc2be8fb1090ca3cba54efreed@android.com    fCurrIndex = 0;
453e0f13eeb8e527cfd2541063ba2dd89c7d31d71cereed@android.com    this->loadView(fSamples[fCurrIndex]());
454f0b5f68807cfa18cce0647d275778147901945cdreed@google.com
45506c3b6bfd53c93d5ba49cf4d87b2c5c1bf33f072twiz@google.com#ifdef SK_BUILD_FOR_MAC
456f0b5f68807cfa18cce0647d275778147901945cdreed@google.com    testpdf();
45706c3b6bfd53c93d5ba49cf4d87b2c5c1bf33f072twiz@google.com#endif
4588a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
4598a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
4608a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comSampleWindow::~SampleWindow() {
4618a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    delete fPicture;
462f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com    delete fGpuCanvas;
4632e7b43d33cc495663cb814a7a9d1ecdc09c31828bsalomon@google.com    if (NULL != fGrContext) {
4642e7b43d33cc495663cb814a7a9d1ecdc09c31828bsalomon@google.com        fGrContext->unref();
4652e7b43d33cc495663cb814a7a9d1ecdc09c31828bsalomon@google.com    }
4660f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo    fTypeface->unref();
4678a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
4688a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
46955e76b209c9249308a9ba3d75c2472dd55e9d298reed@android.comstatic SkBitmap capture_bitmap(SkCanvas* canvas) {
47055e76b209c9249308a9ba3d75c2472dd55e9d298reed@android.com    SkBitmap bm;
47155e76b209c9249308a9ba3d75c2472dd55e9d298reed@android.com    const SkBitmap& src = canvas->getDevice()->accessBitmap(false);
47255e76b209c9249308a9ba3d75c2472dd55e9d298reed@android.com    src.copyTo(&bm, src.config());
47355e76b209c9249308a9ba3d75c2472dd55e9d298reed@android.com    return bm;
47455e76b209c9249308a9ba3d75c2472dd55e9d298reed@android.com}
47555e76b209c9249308a9ba3d75c2472dd55e9d298reed@android.com
47655e76b209c9249308a9ba3d75c2472dd55e9d298reed@android.comstatic bool bitmap_diff(SkCanvas* canvas, const SkBitmap& orig,
47755e76b209c9249308a9ba3d75c2472dd55e9d298reed@android.com                        SkBitmap* diff) {
47855e76b209c9249308a9ba3d75c2472dd55e9d298reed@android.com    const SkBitmap& src = canvas->getDevice()->accessBitmap(false);
4792e7b43d33cc495663cb814a7a9d1ecdc09c31828bsalomon@google.com
48055e76b209c9249308a9ba3d75c2472dd55e9d298reed@android.com    SkAutoLockPixels alp0(src);
48155e76b209c9249308a9ba3d75c2472dd55e9d298reed@android.com    SkAutoLockPixels alp1(orig);
48255e76b209c9249308a9ba3d75c2472dd55e9d298reed@android.com    for (int y = 0; y < src.height(); y++) {
48355e76b209c9249308a9ba3d75c2472dd55e9d298reed@android.com        const void* srcP = src.getAddr(0, y);
48455e76b209c9249308a9ba3d75c2472dd55e9d298reed@android.com        const void* origP = orig.getAddr(0, y);
48555e76b209c9249308a9ba3d75c2472dd55e9d298reed@android.com        size_t bytes = src.width() * src.bytesPerPixel();
48655e76b209c9249308a9ba3d75c2472dd55e9d298reed@android.com        if (memcmp(srcP, origP, bytes)) {
48755e76b209c9249308a9ba3d75c2472dd55e9d298reed@android.com            SkDebugf("---------- difference on line %d\n", y);
48855e76b209c9249308a9ba3d75c2472dd55e9d298reed@android.com            return true;
48955e76b209c9249308a9ba3d75c2472dd55e9d298reed@android.com        }
49055e76b209c9249308a9ba3d75c2472dd55e9d298reed@android.com    }
49155e76b209c9249308a9ba3d75c2472dd55e9d298reed@android.com    return false;
49255e76b209c9249308a9ba3d75c2472dd55e9d298reed@android.com}
49355e76b209c9249308a9ba3d75c2472dd55e9d298reed@android.com
4940f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggostatic void drawText(SkCanvas* canvas, SkString string, SkScalar left, SkScalar top, SkPaint& paint)
4950f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo{
4960f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo    SkColor desiredColor = paint.getColor();
4970f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo    paint.setColor(SK_ColorWHITE);
4980f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo    const char* c_str = string.c_str();
4990f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo    size_t size = string.size();
5000f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo    SkRect bounds;
5010f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo    paint.measureText(c_str, size, &bounds);
5020f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo    bounds.offset(left, top);
5030f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo    SkScalar inset = SkIntToScalar(-2);
5040f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo    bounds.inset(inset, inset);
5050f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo    canvas->drawRect(bounds, paint);
5060f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo    if (desiredColor != SK_ColorBLACK) {
5070f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo        paint.setColor(SK_ColorBLACK);
5080f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo        canvas->drawText(c_str, size, left + SK_Scalar1, top + SK_Scalar1, paint);
5090f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo    }
5100f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo    paint.setColor(desiredColor);
5110f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo    canvas->drawText(c_str, size, left, top, paint);
5120f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo}
5130f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo
5144417740a480786ca65379ba5b398c500ba34ee18reed@android.com#define XCLIP_N  8
5154417740a480786ca65379ba5b398c500ba34ee18reed@android.com#define YCLIP_N  8
516e522ca5d5f249bd51a00cb68bb051f811d0a9e85reed@android.com
517e522ca5d5f249bd51a00cb68bb051f811d0a9e85reed@android.comvoid SampleWindow::draw(SkCanvas* canvas) {
5184417740a480786ca65379ba5b398c500ba34ee18reed@android.com    // update the animation time
519f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com    gAnimTimePrev = gAnimTime;
5204417740a480786ca65379ba5b398c500ba34ee18reed@android.com    gAnimTime = SkTime::GetMSecs();
5214417740a480786ca65379ba5b398c500ba34ee18reed@android.com
522569e0435af62bdb88a662fa0592f75673a17afd9reed@google.com    SkScalar cx = SkScalarHalf(this->width());
523569e0435af62bdb88a662fa0592f75673a17afd9reed@google.com    SkScalar cy = SkScalarHalf(this->height());
524569e0435af62bdb88a662fa0592f75673a17afd9reed@google.com
525dd0cd34067d103ace7c6739405cb7885d8ad3fb2mike@reedtribe.org    if (fZoomLevel) {
526dd0cd34067d103ace7c6739405cb7885d8ad3fb2mike@reedtribe.org        SkMatrix m;
527dd0cd34067d103ace7c6739405cb7885d8ad3fb2mike@reedtribe.org        SkPoint center;
528dd0cd34067d103ace7c6739405cb7885d8ad3fb2mike@reedtribe.org        m = canvas->getTotalMatrix();//.invert(&m);
529dd0cd34067d103ace7c6739405cb7885d8ad3fb2mike@reedtribe.org        m.mapXY(cx, cy, &center);
530dd0cd34067d103ace7c6739405cb7885d8ad3fb2mike@reedtribe.org        cx = center.fX;
531dd0cd34067d103ace7c6739405cb7885d8ad3fb2mike@reedtribe.org        cy = center.fY;
53211f0b519766dabed4ce882f3ee7c07a68d3ccb52bsalomon@google.com
533dd0cd34067d103ace7c6739405cb7885d8ad3fb2mike@reedtribe.org        m.setTranslate(-cx, -cy);
534dd0cd34067d103ace7c6739405cb7885d8ad3fb2mike@reedtribe.org        m.postScale(fZoomScale, fZoomScale);
535dd0cd34067d103ace7c6739405cb7885d8ad3fb2mike@reedtribe.org        m.postTranslate(cx, cy);
53611f0b519766dabed4ce882f3ee7c07a68d3ccb52bsalomon@google.com
537dd0cd34067d103ace7c6739405cb7885d8ad3fb2mike@reedtribe.org        canvas->concat(m);
538dd0cd34067d103ace7c6739405cb7885d8ad3fb2mike@reedtribe.org    }
53911f0b519766dabed4ce882f3ee7c07a68d3ccb52bsalomon@google.com
540569e0435af62bdb88a662fa0592f75673a17afd9reed@google.com    if (fFlipAxis) {
541569e0435af62bdb88a662fa0592f75673a17afd9reed@google.com        SkMatrix m;
542569e0435af62bdb88a662fa0592f75673a17afd9reed@google.com        m.setTranslate(cx, cy);
543569e0435af62bdb88a662fa0592f75673a17afd9reed@google.com        if (fFlipAxis & kFlipAxis_X) {
544569e0435af62bdb88a662fa0592f75673a17afd9reed@google.com            m.preScale(-SK_Scalar1, SK_Scalar1);
545569e0435af62bdb88a662fa0592f75673a17afd9reed@google.com        }
546569e0435af62bdb88a662fa0592f75673a17afd9reed@google.com        if (fFlipAxis & kFlipAxis_Y) {
547569e0435af62bdb88a662fa0592f75673a17afd9reed@google.com            m.preScale(SK_Scalar1, -SK_Scalar1);
548569e0435af62bdb88a662fa0592f75673a17afd9reed@google.com        }
549569e0435af62bdb88a662fa0592f75673a17afd9reed@google.com        m.preTranslate(-cx, -cy);
550569e0435af62bdb88a662fa0592f75673a17afd9reed@google.com        canvas->concat(m);
551569e0435af62bdb88a662fa0592f75673a17afd9reed@google.com    }
552569e0435af62bdb88a662fa0592f75673a17afd9reed@google.com
55352f57e1d11a00bdc5efb96709446546cdbc1ff9dreed@google.com    // Apply any gesture matrix
55452f57e1d11a00bdc5efb96709446546cdbc1ff9dreed@google.com    if (true) {
55552f57e1d11a00bdc5efb96709446546cdbc1ff9dreed@google.com        const SkMatrix& localM = fGesture.localM();
55652f57e1d11a00bdc5efb96709446546cdbc1ff9dreed@google.com        if (localM.getType() & SkMatrix::kScale_Mask) {
55752f57e1d11a00bdc5efb96709446546cdbc1ff9dreed@google.com            canvas->setExternalMatrix(&localM);
55852f57e1d11a00bdc5efb96709446546cdbc1ff9dreed@google.com        }
55952f57e1d11a00bdc5efb96709446546cdbc1ff9dreed@google.com        canvas->concat(localM);
56052f57e1d11a00bdc5efb96709446546cdbc1ff9dreed@google.com        canvas->concat(fGesture.globalM());
56111f0b519766dabed4ce882f3ee7c07a68d3ccb52bsalomon@google.com
56252f57e1d11a00bdc5efb96709446546cdbc1ff9dreed@google.com        if (fGesture.isActive()) {
56352f57e1d11a00bdc5efb96709446546cdbc1ff9dreed@google.com            this->inval(NULL);
56452f57e1d11a00bdc5efb96709446546cdbc1ff9dreed@google.com        }
56552f57e1d11a00bdc5efb96709446546cdbc1ff9dreed@google.com    }
56611f0b519766dabed4ce882f3ee7c07a68d3ccb52bsalomon@google.com
567e522ca5d5f249bd51a00cb68bb051f811d0a9e85reed@android.com    if (fNClip) {
56855e76b209c9249308a9ba3d75c2472dd55e9d298reed@android.com        this->INHERITED::draw(canvas);
56955e76b209c9249308a9ba3d75c2472dd55e9d298reed@android.com        SkBitmap orig = capture_bitmap(canvas);
570e522ca5d5f249bd51a00cb68bb051f811d0a9e85reed@android.com
571e522ca5d5f249bd51a00cb68bb051f811d0a9e85reed@android.com        const SkScalar w = this->width();
572e522ca5d5f249bd51a00cb68bb051f811d0a9e85reed@android.com        const SkScalar h = this->height();
573e522ca5d5f249bd51a00cb68bb051f811d0a9e85reed@android.com        const SkScalar cw = w / XCLIP_N;
574e522ca5d5f249bd51a00cb68bb051f811d0a9e85reed@android.com        const SkScalar ch = h / YCLIP_N;
575e522ca5d5f249bd51a00cb68bb051f811d0a9e85reed@android.com        for (int y = 0; y < YCLIP_N; y++) {
57655e76b209c9249308a9ba3d75c2472dd55e9d298reed@android.com            SkRect r;
57755e76b209c9249308a9ba3d75c2472dd55e9d298reed@android.com            r.fTop = y * ch;
57855e76b209c9249308a9ba3d75c2472dd55e9d298reed@android.com            r.fBottom = (y + 1) * ch;
57955e76b209c9249308a9ba3d75c2472dd55e9d298reed@android.com            if (y == YCLIP_N - 1) {
58055e76b209c9249308a9ba3d75c2472dd55e9d298reed@android.com                r.fBottom = h;
58155e76b209c9249308a9ba3d75c2472dd55e9d298reed@android.com            }
582e522ca5d5f249bd51a00cb68bb051f811d0a9e85reed@android.com            for (int x = 0; x < XCLIP_N; x++) {
583e522ca5d5f249bd51a00cb68bb051f811d0a9e85reed@android.com                SkAutoCanvasRestore acr(canvas, true);
58455e76b209c9249308a9ba3d75c2472dd55e9d298reed@android.com                r.fLeft = x * cw;
58555e76b209c9249308a9ba3d75c2472dd55e9d298reed@android.com                r.fRight = (x + 1) * cw;
58655e76b209c9249308a9ba3d75c2472dd55e9d298reed@android.com                if (x == XCLIP_N - 1) {
58755e76b209c9249308a9ba3d75c2472dd55e9d298reed@android.com                    r.fRight = w;
58855e76b209c9249308a9ba3d75c2472dd55e9d298reed@android.com                }
589e522ca5d5f249bd51a00cb68bb051f811d0a9e85reed@android.com                canvas->clipRect(r);
590e522ca5d5f249bd51a00cb68bb051f811d0a9e85reed@android.com                this->INHERITED::draw(canvas);
591e522ca5d5f249bd51a00cb68bb051f811d0a9e85reed@android.com            }
592e522ca5d5f249bd51a00cb68bb051f811d0a9e85reed@android.com        }
5932e7b43d33cc495663cb814a7a9d1ecdc09c31828bsalomon@google.com
59455e76b209c9249308a9ba3d75c2472dd55e9d298reed@android.com        SkBitmap diff;
59555e76b209c9249308a9ba3d75c2472dd55e9d298reed@android.com        if (bitmap_diff(canvas, orig, &diff)) {
59655e76b209c9249308a9ba3d75c2472dd55e9d298reed@android.com        }
597e522ca5d5f249bd51a00cb68bb051f811d0a9e85reed@android.com    } else {
598e522ca5d5f249bd51a00cb68bb051f811d0a9e85reed@android.com        this->INHERITED::draw(canvas);
599e522ca5d5f249bd51a00cb68bb051f811d0a9e85reed@android.com    }
6000f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo    if (fShowZoomer) {
6010f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo        int count = canvas->save();
6020f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo        canvas->resetMatrix();
6030f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo        // Ensure the mouse position is on screen.
604261b8e2ca1cf22303ad95267f0bdc6e87e1bbe70reed@google.com        int width = SkScalarRound(this->width());
605261b8e2ca1cf22303ad95267f0bdc6e87e1bbe70reed@google.com        int height = SkScalarRound(this->height());
6060f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo        if (fMouseX >= width) fMouseX = width - 1;
6070f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo        else if (fMouseX < 0) fMouseX = 0;
6080f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo        if (fMouseY >= height) fMouseY = height - 1;
6090f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo        else if (fMouseY < 0) fMouseY = 0;
6100f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo        SkBitmap bitmap = capture_bitmap(canvas);
6110f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo        // Find the size of the zoomed in view, forced to be odd, so the examined pixel is in the middle.
6123ce59dc4999de5d6c6913af662c8b0b8020a4ef7mike@reedtribe.org        int zoomedWidth = (width >> 1) | 1;
6133ce59dc4999de5d6c6913af662c8b0b8020a4ef7mike@reedtribe.org        int zoomedHeight = (height >> 1) | 1;
6140f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo        SkIRect src;
6150f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo        src.set(0, 0, zoomedWidth / fFatBitsScale, zoomedHeight / fFatBitsScale);
6160f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo        src.offset(fMouseX - (src.width()>>1), fMouseY - (src.height()>>1));
6170f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo        SkRect dest;
6180f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo        dest.set(0, 0, SkIntToScalar(zoomedWidth), SkIntToScalar(zoomedHeight));
6190f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo        dest.offset(SkIntToScalar(width - zoomedWidth), SkIntToScalar(height - zoomedHeight));
6200f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo        SkPaint paint;
6210f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo        // Clear the background behind our zoomed in view
6220f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo        paint.setColor(SK_ColorWHITE);
6230f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo        canvas->drawRect(dest, paint);
6240f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo        canvas->drawBitmapRect(bitmap, &src, dest);
6250f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo        paint.setColor(SK_ColorBLACK);
6260f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo        paint.setStyle(SkPaint::kStroke_Style);
6270f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo        // Draw a border around the pixel in the middle
6280f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo        SkRect originalPixel;
6290f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo        originalPixel.set(SkIntToScalar(fMouseX), SkIntToScalar(fMouseY), SkIntToScalar(fMouseX + 1), SkIntToScalar(fMouseY + 1));
6300f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo        SkMatrix matrix;
6310f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo        SkRect scalarSrc;
6320f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo        scalarSrc.set(src);
6330f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo        SkColor color = bitmap.getColor(fMouseX, fMouseY);
6340f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo        if (matrix.setRectToRect(scalarSrc, dest, SkMatrix::kFill_ScaleToFit)) {
6350f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo            SkRect pixel;
6360f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo            matrix.mapRect(&pixel, originalPixel);
6370f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo            // TODO Perhaps measure the values and make the outline white if it's "dark"
6380f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo            if (color == SK_ColorBLACK) {
6390f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo                paint.setColor(SK_ColorWHITE);
6400f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo            }
6410f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo            canvas->drawRect(pixel, paint);
6420f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo        }
6430f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo        paint.setColor(SK_ColorBLACK);
6440f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo        // Draw a border around the destination rectangle
6450f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo        canvas->drawRect(dest, paint);
6460f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo        paint.setStyle(SkPaint::kStrokeAndFill_Style);
6470f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo        // Identify the pixel and its color on screen
6480f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo        paint.setTypeface(fTypeface);
6490f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo        paint.setAntiAlias(true);
6500f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo        SkScalar lineHeight = paint.getFontMetrics(NULL);
6510f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo        SkString string;
6520f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo        string.appendf("(%i, %i)", fMouseX, fMouseY);
6530f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo        SkScalar left = dest.fLeft + SkIntToScalar(3);
6540f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo        SkScalar i = SK_Scalar1;
6550f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo        drawText(canvas, string, left, SkScalarMulAdd(lineHeight, i, dest.fTop), paint);
6560f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo        // Alpha
6570f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo        i += SK_Scalar1;
6580f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo        string.reset();
6590f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo        string.appendf("A: %X", SkColorGetA(color));
6600f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo        drawText(canvas, string, left, SkScalarMulAdd(lineHeight, i, dest.fTop), paint);
6610f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo        // Red
6620f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo        i += SK_Scalar1;
6630f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo        string.reset();
6640f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo        string.appendf("R: %X", SkColorGetR(color));
6650f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo        paint.setColor(SK_ColorRED);
6660f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo        drawText(canvas, string, left, SkScalarMulAdd(lineHeight, i, dest.fTop), paint);
6670f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo        // Green
6680f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo        i += SK_Scalar1;
6690f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo        string.reset();
6700f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo        string.appendf("G: %X", SkColorGetG(color));
6710f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo        paint.setColor(SK_ColorGREEN);
6720f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo        drawText(canvas, string, left, SkScalarMulAdd(lineHeight, i, dest.fTop), paint);
6730f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo        // Blue
6740f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo        i += SK_Scalar1;
6750f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo        string.reset();
6760f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo        string.appendf("B: %X", SkColorGetB(color));
6770f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo        paint.setColor(SK_ColorBLUE);
6780f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo        drawText(canvas, string, left, SkScalarMulAdd(lineHeight, i, dest.fTop), paint);
6790f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo        canvas->restoreToCount(count);
6800f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo    }
681e522ca5d5f249bd51a00cb68bb051f811d0a9e85reed@android.com}
682e522ca5d5f249bd51a00cb68bb051f811d0a9e85reed@android.com
6838a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comvoid SampleWindow::onDraw(SkCanvas* canvas) {
6848a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    if (fRepeatDrawing) {
6858a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        this->inval(NULL);
6868a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    }
6878a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
6888a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
6898a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkColorPriv.h"
6908a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
6918a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comstatic void reverseRedAndBlue(const SkBitmap& bm) {
6928a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkASSERT(bm.config() == SkBitmap::kARGB_8888_Config);
6938a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    uint8_t* p = (uint8_t*)bm.getPixels();
6948a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    uint8_t* stop = p + bm.getSize();
6958a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    while (p < stop) {
6968a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        // swap red/blue (to go from ARGB(int) to RGBA(memory) and premultiply
6978a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        unsigned scale = SkAlpha255To256(p[3]);
6988a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        unsigned r = p[2];
6998a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        unsigned b = p[0];
7008a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        p[0] = SkAlphaMul(r, scale);
7018a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        p[1] = SkAlphaMul(p[1], scale);
7028a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        p[2] = SkAlphaMul(b, scale);
7038a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        p += 4;
7048a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    }
7058a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
7068a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
7078a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comSkCanvas* SampleWindow::beforeChildren(SkCanvas* canvas) {
708f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com    if (kGPU_CanvasType != fCanvasType) {
7096efdc47afc8bb24603fc0d15146ada609b728f2freed@android.com#ifdef SK_SUPPORT_GL
710f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com        detachGL();
7112e7b43d33cc495663cb814a7a9d1ecdc09c31828bsalomon@google.com#endif
712f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com    }
7132e7b43d33cc495663cb814a7a9d1ecdc09c31828bsalomon@google.com
7148a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    switch (fCanvasType) {
7158a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        case kRaster_CanvasType:
7168a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            canvas = this->INHERITED::beforeChildren(canvas);
7178a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            break;
7188a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        case kPicture_CanvasType:
7198a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            fPicture = new SkPicture;
7208a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            canvas = fPicture->beginRecording(9999, 9999);
7218a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            break;
722ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com        case kGPU_CanvasType: {
72364e3eb24e52a84613ff8c1da5dac6f4b5ba38320reed@google.com            if (make3DReady()) {
724f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com                SkDevice* device = canvas->getDevice();
7252e7b43d33cc495663cb814a7a9d1ecdc09c31828bsalomon@google.com                const SkBitmap& bitmap = device->accessBitmap(true);
7262e7b43d33cc495663cb814a7a9d1ecdc09c31828bsalomon@google.com
7275782d712ffc31557d0cb12d5a220cebb783f6895bsalomon@google.com                GrRenderTarget* renderTarget;
7285782d712ffc31557d0cb12d5a220cebb783f6895bsalomon@google.com                renderTarget = fGrContext->createRenderTargetFrom3DApiState();
7295782d712ffc31557d0cb12d5a220cebb783f6895bsalomon@google.com                fGpuCanvas = new SkGpuCanvas(fGrContext, renderTarget);
7305782d712ffc31557d0cb12d5a220cebb783f6895bsalomon@google.com                renderTarget->unref();
7315782d712ffc31557d0cb12d5a220cebb783f6895bsalomon@google.com
7322fbc7fa460c99bffa78b9afb9aaa4dc0db68e1babsalomon@google.com                device = fGpuCanvas->createDevice(SkBitmap::kARGB_8888_Config,
7332fbc7fa460c99bffa78b9afb9aaa4dc0db68e1babsalomon@google.com                                                  bitmap.width(), bitmap.height(),
7342fbc7fa460c99bffa78b9afb9aaa4dc0db68e1babsalomon@google.com                                                  false, false);
735ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com                fGpuCanvas->setDevice(device)->unref();
73611f0b519766dabed4ce882f3ee7c07a68d3ccb52bsalomon@google.com
737dd0cd34067d103ace7c6739405cb7885d8ad3fb2mike@reedtribe.org                fGpuCanvas->concat(canvas->getTotalMatrix());
738f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com                canvas = fGpuCanvas;
7392e7b43d33cc495663cb814a7a9d1ecdc09c31828bsalomon@google.com
740f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com            } else {
741f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com                canvas = this->INHERITED::beforeChildren(canvas);
742f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com            }
7438a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            break;
744ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com        }
7458a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    }
7468a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
7478a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    if (fUseClip) {
7488a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        canvas->drawColor(0xFFFF88FF);
7498a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        canvas->clipPath(fClipPath);
7508a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    }
7518a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
7528a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    return canvas;
7538a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
7548a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
7558a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comstatic void paint_rgn(const SkBitmap& bm, const SkIRect& r,
7568a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                      const SkRegion& rgn) {
7578a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkCanvas    canvas(bm);
7588a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkRegion    inval(rgn);
7598a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
7608a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    inval.translate(r.fLeft, r.fTop);
7618a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    canvas.clipRegion(inval);
7628a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    canvas.drawColor(0xFFFF8080);
7638a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
7648a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
7658a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comvoid SampleWindow::afterChildren(SkCanvas* orig) {
766f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com    if (fRequestGrabImage) {
767f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com        fRequestGrabImage = false;
7682e7b43d33cc495663cb814a7a9d1ecdc09c31828bsalomon@google.com
769f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com        SkCanvas* canvas = fGpuCanvas ? fGpuCanvas : orig;
770f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com        SkDevice* device = canvas->getDevice();
771669fdc4ed8ed461a141cb97d0afdd9ef72a82be1bsalomon@google.com        SkBitmap bmp;
772669fdc4ed8ed461a141cb97d0afdd9ef72a82be1bsalomon@google.com        if (device->accessBitmap(false).copyTo(&bmp, SkBitmap::kARGB_8888_Config)) {
773f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com            static int gSampleGrabCounter;
774f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com            SkString name;
775f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com            name.printf("sample_grab_%d", gSampleGrabCounter++);
776669fdc4ed8ed461a141cb97d0afdd9ef72a82be1bsalomon@google.com            SkImageEncoder::EncodeFile(name.c_str(), bmp,
777f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com                                       SkImageEncoder::kPNG_Type, 100);
778f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com        }
779f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com    }
780f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com
7818a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    switch (fCanvasType) {
7828a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        case kRaster_CanvasType:
7838a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            break;
7848a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        case kPicture_CanvasType:
785aefd2bc75738963b9b6579897be32bfbc8fb00afreed@android.com            if (true) {
7868a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                SkPicture* pict = new SkPicture(*fPicture);
7878a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                fPicture->unref();
7888a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                orig->drawPicture(*pict);
7898a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                pict->unref();
790aefd2bc75738963b9b6579897be32bfbc8fb00afreed@android.com            } else if (true) {
7918a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                SkDynamicMemoryWStream ostream;
7928a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                fPicture->serialize(&ostream);
7938a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                fPicture->unref();
7942e7b43d33cc495663cb814a7a9d1ecdc09c31828bsalomon@google.com
7958a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                SkMemoryStream istream(ostream.getStream(), ostream.getOffset());
7968a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                SkPicture pict(&istream);
7978a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                orig->drawPicture(pict);
7988a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            } else {
7998a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                fPicture->draw(orig);
8008a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                fPicture->unref();
8018a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            }
8028a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            fPicture = NULL;
8038a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            break;
8046efdc47afc8bb24603fc0d15146ada609b728f2freed@android.com#ifdef SK_SUPPORT_GL
805f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com        case kGPU_CanvasType:
806f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com            delete fGpuCanvas;
807f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com            fGpuCanvas = NULL;
808f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com            presentGL();
809f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com            break;
8106efdc47afc8bb24603fc0d15146ada609b728f2freed@android.com#endif
8118a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    }
8122e7b43d33cc495663cb814a7a9d1ecdc09c31828bsalomon@google.com
81317d7aec8967f7e2f6bb420c6647be11285fac2f1reed@google.com    // Do this after presentGL and other finishing, rather than in afterChild
81417d7aec8967f7e2f6bb420c6647be11285fac2f1reed@google.com    if (fMeasureFPS && fMeasureFPS_Time) {
81517d7aec8967f7e2f6bb420c6647be11285fac2f1reed@google.com        fMeasureFPS_Time = SkTime::GetMSecs() - fMeasureFPS_Time;
81617d7aec8967f7e2f6bb420c6647be11285fac2f1reed@google.com        this->updateTitle();
81717d7aec8967f7e2f6bb420c6647be11285fac2f1reed@google.com        postInvalDelay(this->getSinkID());
81817d7aec8967f7e2f6bb420c6647be11285fac2f1reed@google.com    }
81917d7aec8967f7e2f6bb420c6647be11285fac2f1reed@google.com
82017d7aec8967f7e2f6bb420c6647be11285fac2f1reed@google.com    //    if ((fScrollTestX | fScrollTestY) != 0)
821f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com    if (false) {
8228a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        const SkBitmap& bm = orig->getDevice()->accessBitmap(true);
8238a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        int dx = fScrollTestX * 7;
8248a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        int dy = fScrollTestY * 7;
8258a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        SkIRect r;
8268a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        SkRegion inval;
8272e7b43d33cc495663cb814a7a9d1ecdc09c31828bsalomon@google.com
8288a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        r.set(50, 50, 50+100, 50+100);
8298a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        bm.scrollRect(&r, dx, dy, &inval);
8308a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        paint_rgn(bm, r, inval);
8312eb595292b9624371d1698ae9da7accb4c09c26cmike@reedtribe.org    }
8328a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
8338a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
8346c5f6f25b43f1210decb48956c1a2fbe5b58f889reed@android.comvoid SampleWindow::beforeChild(SkView* child, SkCanvas* canvas) {
8356c5f6f25b43f1210decb48956c1a2fbe5b58f889reed@android.com    if (fScale) {
8366c5f6f25b43f1210decb48956c1a2fbe5b58f889reed@android.com        SkScalar scale = SK_Scalar1 * 7 / 10;
8376c5f6f25b43f1210decb48956c1a2fbe5b58f889reed@android.com        SkScalar cx = this->width() / 2;
8386c5f6f25b43f1210decb48956c1a2fbe5b58f889reed@android.com        SkScalar cy = this->height() / 2;
8396c5f6f25b43f1210decb48956c1a2fbe5b58f889reed@android.com        canvas->translate(cx, cy);
8406c5f6f25b43f1210decb48956c1a2fbe5b58f889reed@android.com        canvas->scale(scale, scale);
8416c5f6f25b43f1210decb48956c1a2fbe5b58f889reed@android.com        canvas->translate(-cx, -cy);
8426c5f6f25b43f1210decb48956c1a2fbe5b58f889reed@android.com    }
8436c5f6f25b43f1210decb48956c1a2fbe5b58f889reed@android.com    if (fRotate) {
8446c5f6f25b43f1210decb48956c1a2fbe5b58f889reed@android.com        SkScalar cx = this->width() / 2;
8456c5f6f25b43f1210decb48956c1a2fbe5b58f889reed@android.com        SkScalar cy = this->height() / 2;
8466c5f6f25b43f1210decb48956c1a2fbe5b58f889reed@android.com        canvas->translate(cx, cy);
8476c5f6f25b43f1210decb48956c1a2fbe5b58f889reed@android.com        canvas->rotate(SkIntToScalar(30));
8486c5f6f25b43f1210decb48956c1a2fbe5b58f889reed@android.com        canvas->translate(-cx, -cy);
8496c5f6f25b43f1210decb48956c1a2fbe5b58f889reed@android.com    }
850f0b5f68807cfa18cce0647d275778147901945cdreed@google.com
851569e0435af62bdb88a662fa0592f75673a17afd9reed@google.com    if (kUnknown_SkTriState != fLCDState ||
852569e0435af62bdb88a662fa0592f75673a17afd9reed@google.com        kUnknown_SkTriState != fAAState) {
853569e0435af62bdb88a662fa0592f75673a17afd9reed@google.com        canvas->setDrawFilter(new FlagsDrawFilter(fLCDState, fAAState))->unref();
854f0b5f68807cfa18cce0647d275778147901945cdreed@google.com    }
8552eb595292b9624371d1698ae9da7accb4c09c26cmike@reedtribe.org
8562eb595292b9624371d1698ae9da7accb4c09c26cmike@reedtribe.org    if (fMeasureFPS) {
857f21833999d90ad9c8c584cff3238797b39cfc00breed@google.com        fMeasureFPS_Time = 0;   // 0 means the child is not aware of repeat-draw
858f21833999d90ad9c8c584cff3238797b39cfc00breed@google.com        if (SampleView::SetRepeatDraw(child, FPS_REPEAT_COUNT)) {
859f21833999d90ad9c8c584cff3238797b39cfc00breed@google.com            fMeasureFPS_Time = SkTime::GetMSecs();
860f21833999d90ad9c8c584cff3238797b39cfc00breed@google.com        }
861f21833999d90ad9c8c584cff3238797b39cfc00breed@google.com    } else {
862f21833999d90ad9c8c584cff3238797b39cfc00breed@google.com        (void)SampleView::SetRepeatDraw(child, 1);
8632eb595292b9624371d1698ae9da7accb4c09c26cmike@reedtribe.org    }
8646c5f6f25b43f1210decb48956c1a2fbe5b58f889reed@android.com}
8656c5f6f25b43f1210decb48956c1a2fbe5b58f889reed@android.com
8666c5f6f25b43f1210decb48956c1a2fbe5b58f889reed@android.comvoid SampleWindow::afterChild(SkView* child, SkCanvas* canvas) {
867f0b5f68807cfa18cce0647d275778147901945cdreed@google.com    canvas->setDrawFilter(NULL);
8686c5f6f25b43f1210decb48956c1a2fbe5b58f889reed@android.com}
8696c5f6f25b43f1210decb48956c1a2fbe5b58f889reed@android.com
8708a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comstatic SkBitmap::Config gConfigCycle[] = {
8718a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkBitmap::kNo_Config,           // none -> none
8728a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkBitmap::kNo_Config,           // a1 -> none
8738a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkBitmap::kNo_Config,           // a8 -> none
8748a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkBitmap::kNo_Config,           // index8 -> none
8758a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkBitmap::kARGB_4444_Config,    // 565 -> 4444
8768a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkBitmap::kARGB_8888_Config,    // 4444 -> 8888
8778a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkBitmap::kRGB_565_Config       // 8888 -> 565
8788a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com};
8798a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
8808a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comstatic SkBitmap::Config cycle_configs(SkBitmap::Config c) {
8818a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    return gConfigCycle[c];
8828a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
8838a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
884dd0cd34067d103ace7c6739405cb7885d8ad3fb2mike@reedtribe.orgvoid SampleWindow::changeZoomLevel(int delta) {
885dd0cd34067d103ace7c6739405cb7885d8ad3fb2mike@reedtribe.org    fZoomLevel += delta;
886dd0cd34067d103ace7c6739405cb7885d8ad3fb2mike@reedtribe.org    if (fZoomLevel > 0) {
887dd0cd34067d103ace7c6739405cb7885d8ad3fb2mike@reedtribe.org        fZoomLevel = SkMin32(fZoomLevel, MAX_ZOOM_LEVEL);
888dd0cd34067d103ace7c6739405cb7885d8ad3fb2mike@reedtribe.org        fZoomScale = SkIntToScalar(fZoomLevel + 1);
889dd0cd34067d103ace7c6739405cb7885d8ad3fb2mike@reedtribe.org    } else if (fZoomLevel < 0) {
890dd0cd34067d103ace7c6739405cb7885d8ad3fb2mike@reedtribe.org        fZoomLevel = SkMax32(fZoomLevel, MIN_ZOOM_LEVEL);
891dd0cd34067d103ace7c6739405cb7885d8ad3fb2mike@reedtribe.org        fZoomScale = SK_Scalar1 / (1 - fZoomLevel);
892dd0cd34067d103ace7c6739405cb7885d8ad3fb2mike@reedtribe.org    } else {
893dd0cd34067d103ace7c6739405cb7885d8ad3fb2mike@reedtribe.org        fZoomScale = SK_Scalar1;
894dd0cd34067d103ace7c6739405cb7885d8ad3fb2mike@reedtribe.org    }
895dd0cd34067d103ace7c6739405cb7885d8ad3fb2mike@reedtribe.org
896dd0cd34067d103ace7c6739405cb7885d8ad3fb2mike@reedtribe.org    this->inval(NULL);
897dd0cd34067d103ace7c6739405cb7885d8ad3fb2mike@reedtribe.org}
898dd0cd34067d103ace7c6739405cb7885d8ad3fb2mike@reedtribe.org
8998a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.combool SampleWindow::nextSample() {
90034245c7871f6339de8cc2be8fb1090ca3cba54efreed@android.com    fCurrIndex = (fCurrIndex + 1) % fSamples.count();
90134245c7871f6339de8cc2be8fb1090ca3cba54efreed@android.com    this->loadView(fSamples[fCurrIndex]());
90234245c7871f6339de8cc2be8fb1090ca3cba54efreed@android.com    return true;
9038a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
9048a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
9058a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.combool SampleWindow::onEvent(const SkEvent& evt) {
9068a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    if (evt.isType(ANIMATING_EVENTTYPE)) {
9078a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        if (fAnimating) {
9088a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            this->nextSample();
9098a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            this->postAnimatingEvent();
9108a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        }
9118a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        return true;
9128a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    }
91334245c7871f6339de8cc2be8fb1090ca3cba54efreed@android.com    if (evt.isType("set-curr-index")) {
91434245c7871f6339de8cc2be8fb1090ca3cba54efreed@android.com        fCurrIndex = evt.getFast32() % fSamples.count();
91534245c7871f6339de8cc2be8fb1090ca3cba54efreed@android.com        this->loadView(fSamples[fCurrIndex]());
91634245c7871f6339de8cc2be8fb1090ca3cba54efreed@android.com        return true;
91734245c7871f6339de8cc2be8fb1090ca3cba54efreed@android.com    }
9182eb595292b9624371d1698ae9da7accb4c09c26cmike@reedtribe.org    if (isInvalEvent(evt)) {
9192eb595292b9624371d1698ae9da7accb4c09c26cmike@reedtribe.org        this->inval(NULL);
9202eb595292b9624371d1698ae9da7accb4c09c26cmike@reedtribe.org        return true;
9212eb595292b9624371d1698ae9da7accb4c09c26cmike@reedtribe.org    }
9228a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    return this->INHERITED::onEvent(evt);
9238a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
9248a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
925f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.combool SampleWindow::onQuery(SkEvent* query) {
926f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com    if (query->isType("get-slide-count")) {
927f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com        query->setFast32(fSamples.count());
928f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com        return true;
929f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com    }
930f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com    if (query->isType("get-slide-title")) {
931f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com        SkView* view = fSamples[query->getFast32()]();
932f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com        SkEvent evt(gTitleEvtName);
933f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com        if (view->doQuery(&evt)) {
934f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com            query->setString("title", evt.findString(gTitleEvtName));
935f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com        }
936f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com        SkSafeUnref(view);
937f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com        return true;
938f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com    }
939f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com    if (query->isType("use-fast-text")) {
940f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com        SkEvent evt(gFastTextEvtName);
941f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com        return curr_view(this)->doQuery(&evt);
942f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com    }
943f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com    return this->INHERITED::onQuery(query);
944f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com}
945f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com
9460ae6b245f2b79bc04f0801b08fcf05abcf98fd6creed@android.comstatic void cleanup_for_filename(SkString* name) {
9470ae6b245f2b79bc04f0801b08fcf05abcf98fd6creed@android.com    char* str = name->writable_str();
948e191b16fda2f5afea3a90653c1cd4f5a3c436e89reed@android.com    for (size_t i = 0; i < name->size(); i++) {
9490ae6b245f2b79bc04f0801b08fcf05abcf98fd6creed@android.com        switch (str[i]) {
9500ae6b245f2b79bc04f0801b08fcf05abcf98fd6creed@android.com            case ':': str[i] = '-'; break;
9510ae6b245f2b79bc04f0801b08fcf05abcf98fd6creed@android.com            case '/': str[i] = '-'; break;
9520ae6b245f2b79bc04f0801b08fcf05abcf98fd6creed@android.com            case ' ': str[i] = '_'; break;
9530ae6b245f2b79bc04f0801b08fcf05abcf98fd6creed@android.com            default: break;
9540ae6b245f2b79bc04f0801b08fcf05abcf98fd6creed@android.com        }
9550ae6b245f2b79bc04f0801b08fcf05abcf98fd6creed@android.com    }
9560ae6b245f2b79bc04f0801b08fcf05abcf98fd6creed@android.com}
9578a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
9588a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.combool SampleWindow::onHandleChar(SkUnichar uni) {
959f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com    {
960f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com        SkView* view = curr_view(this);
961f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com        if (view) {
962f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com            SkEvent evt(gCharEvtName);
963f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com            evt.setFast32(uni);
964f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com            if (view->doQuery(&evt)) {
965f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com                return true;
966f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com            }
967f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com        }
968f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com    }
9692e7b43d33cc495663cb814a7a9d1ecdc09c31828bsalomon@google.com
9708a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    int dx = 0xFF;
9718a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    int dy = 0xFF;
9728a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
9738a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    switch (uni) {
9748a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        case '5': dx =  0; dy =  0; break;
9758a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        case '8': dx =  0; dy = -1; break;
9768a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        case '6': dx =  1; dy =  0; break;
9778a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        case '2': dx =  0; dy =  1; break;
9788a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        case '4': dx = -1; dy =  0; break;
9798a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        case '7': dx = -1; dy = -1; break;
9808a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        case '9': dx =  1; dy = -1; break;
9818a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        case '3': dx =  1; dy =  1; break;
9828a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        case '1': dx = -1; dy =  1; break;
9832e7b43d33cc495663cb814a7a9d1ecdc09c31828bsalomon@google.com
9848a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        default:
9858a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            break;
9868a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    }
9872e7b43d33cc495663cb814a7a9d1ecdc09c31828bsalomon@google.com
9888a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    if (0xFF != dx && 0xFF != dy) {
9898a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        if ((dx | dy) == 0) {
9908a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            fScrollTestX = fScrollTestY = 0;
9918a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        } else {
9928a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            fScrollTestX += dx;
9938a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            fScrollTestY += dy;
9948a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        }
9958a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        this->inval(NULL);
9968a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        return true;
9978a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    }
9982e7b43d33cc495663cb814a7a9d1ecdc09c31828bsalomon@google.com
9990ae6b245f2b79bc04f0801b08fcf05abcf98fd6creed@android.com    switch (uni) {
10000ae6b245f2b79bc04f0801b08fcf05abcf98fd6creed@android.com        case 'a':
10010ae6b245f2b79bc04f0801b08fcf05abcf98fd6creed@android.com            fAnimating = !fAnimating;
10020ae6b245f2b79bc04f0801b08fcf05abcf98fd6creed@android.com            this->postAnimatingEvent();
10030ae6b245f2b79bc04f0801b08fcf05abcf98fd6creed@android.com            this->updateTitle();
10040ae6b245f2b79bc04f0801b08fcf05abcf98fd6creed@android.com            return true;
10052eb595292b9624371d1698ae9da7accb4c09c26cmike@reedtribe.org        case 'b':
10062eb595292b9624371d1698ae9da7accb4c09c26cmike@reedtribe.org            fAAState = cycle_tristate(fAAState);
10076c5f6f25b43f1210decb48956c1a2fbe5b58f889reed@android.com            this->updateTitle();
10086c5f6f25b43f1210decb48956c1a2fbe5b58f889reed@android.com            this->inval(NULL);
10092eb595292b9624371d1698ae9da7accb4c09c26cmike@reedtribe.org            break;
1010fb56a9ee2d64e11aae6d225cb905e95e4a0ee6e5reed@google.com        case 'c':
1011fb56a9ee2d64e11aae6d225cb905e95e4a0ee6e5reed@google.com            fUseClip = !fUseClip;
1012fb56a9ee2d64e11aae6d225cb905e95e4a0ee6e5reed@google.com            this->inval(NULL);
1013fb56a9ee2d64e11aae6d225cb905e95e4a0ee6e5reed@google.com            this->updateTitle();
1014fb56a9ee2d64e11aae6d225cb905e95e4a0ee6e5reed@google.com            return true;
1015f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com        case 'd':
1016f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com            SkGraphics::SetFontCacheUsed(0);
1017f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com            return true;
10182eb595292b9624371d1698ae9da7accb4c09c26cmike@reedtribe.org        case 'f':
10192eb595292b9624371d1698ae9da7accb4c09c26cmike@reedtribe.org            fMeasureFPS = !fMeasureFPS;
10202eb595292b9624371d1698ae9da7accb4c09c26cmike@reedtribe.org            this->inval(NULL);
10212eb595292b9624371d1698ae9da7accb4c09c26cmike@reedtribe.org            break;
1022f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com        case 'g':
1023f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com            fRequestGrabImage = true;
1024f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com            this->inval(NULL);
1025f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com            break;
10262eb595292b9624371d1698ae9da7accb4c09c26cmike@reedtribe.org        case 'i':
10272eb595292b9624371d1698ae9da7accb4c09c26cmike@reedtribe.org            this->zoomIn();
10282eb595292b9624371d1698ae9da7accb4c09c26cmike@reedtribe.org            break;
1029f0b5f68807cfa18cce0647d275778147901945cdreed@google.com        case 'l':
1030569e0435af62bdb88a662fa0592f75673a17afd9reed@google.com            fLCDState = cycle_tristate(fLCDState);
1031569e0435af62bdb88a662fa0592f75673a17afd9reed@google.com            this->updateTitle();
1032569e0435af62bdb88a662fa0592f75673a17afd9reed@google.com            this->inval(NULL);
1033569e0435af62bdb88a662fa0592f75673a17afd9reed@google.com            break;
103408526c07f4f530e56b70d4b22f5a4af35d9ebccascroggo        case 'o':
103508526c07f4f530e56b70d4b22f5a4af35d9ebccascroggo            this->zoomOut();
103608526c07f4f530e56b70d4b22f5a4af35d9ebccascroggo            break;
10372eb595292b9624371d1698ae9da7accb4c09c26cmike@reedtribe.org        case 'r':
10382eb595292b9624371d1698ae9da7accb4c09c26cmike@reedtribe.org            fRotate = !fRotate;
10392eb595292b9624371d1698ae9da7accb4c09c26cmike@reedtribe.org            this->inval(NULL);
10402eb595292b9624371d1698ae9da7accb4c09c26cmike@reedtribe.org            this->updateTitle();
10412eb595292b9624371d1698ae9da7accb4c09c26cmike@reedtribe.org            return true;
10422eb595292b9624371d1698ae9da7accb4c09c26cmike@reedtribe.org        case 's':
10432eb595292b9624371d1698ae9da7accb4c09c26cmike@reedtribe.org            fScale = !fScale;
10442eb595292b9624371d1698ae9da7accb4c09c26cmike@reedtribe.org            this->inval(NULL);
10452eb595292b9624371d1698ae9da7accb4c09c26cmike@reedtribe.org            this->updateTitle();
10462eb595292b9624371d1698ae9da7accb4c09c26cmike@reedtribe.org            return true;
1047569e0435af62bdb88a662fa0592f75673a17afd9reed@google.com        case 'x':
1048569e0435af62bdb88a662fa0592f75673a17afd9reed@google.com            fFlipAxis ^= kFlipAxis_X;
1049569e0435af62bdb88a662fa0592f75673a17afd9reed@google.com            this->updateTitle();
1050569e0435af62bdb88a662fa0592f75673a17afd9reed@google.com            this->inval(NULL);
1051569e0435af62bdb88a662fa0592f75673a17afd9reed@google.com            break;
1052569e0435af62bdb88a662fa0592f75673a17afd9reed@google.com        case 'y':
1053569e0435af62bdb88a662fa0592f75673a17afd9reed@google.com            fFlipAxis ^= kFlipAxis_Y;
1054569e0435af62bdb88a662fa0592f75673a17afd9reed@google.com            this->updateTitle();
1055569e0435af62bdb88a662fa0592f75673a17afd9reed@google.com            this->inval(NULL);
1056569e0435af62bdb88a662fa0592f75673a17afd9reed@google.com            break;
105708526c07f4f530e56b70d4b22f5a4af35d9ebccascroggo        case 'z':
105808526c07f4f530e56b70d4b22f5a4af35d9ebccascroggo            this->toggleZoomer();
105908526c07f4f530e56b70d4b22f5a4af35d9ebccascroggo            break;
10600ae6b245f2b79bc04f0801b08fcf05abcf98fd6creed@android.com        default:
10610ae6b245f2b79bc04f0801b08fcf05abcf98fd6creed@android.com            break;
10628a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    }
10632e7b43d33cc495663cb814a7a9d1ecdc09c31828bsalomon@google.com
10648a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    return this->INHERITED::onHandleChar(uni);
10658a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
10668a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
10678a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkDumpCanvas.h"
10688a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
10698a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.combool SampleWindow::onHandleKey(SkKey key) {
1070f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com    {
1071f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com        SkView* view = curr_view(this);
1072f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com        if (view) {
1073f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com            SkEvent evt(gKeyEvtName);
1074f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com            evt.setFast32(key);
1075f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com            if (view->doQuery(&evt)) {
1076f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com                return true;
1077f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com            }
1078f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com        }
1079f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com    }
1080f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com
10818a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    switch (key) {
10828a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        case kRight_SkKey:
10838a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            if (this->nextSample()) {
10848a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                return true;
10858a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            }
10868a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            break;
10878a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        case kLeft_SkKey:
10888a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            fCanvasType = cycle_canvastype(fCanvasType);
10898a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            this->updateTitle();
10908a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            this->inval(NULL);
10918a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            return true;
10928a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        case kUp_SkKey:
1093dd0cd34067d103ace7c6739405cb7885d8ad3fb2mike@reedtribe.org            if (USE_ARROWS_FOR_ZOOM) {
1094dd0cd34067d103ace7c6739405cb7885d8ad3fb2mike@reedtribe.org                this->changeZoomLevel(1);
1095dd0cd34067d103ace7c6739405cb7885d8ad3fb2mike@reedtribe.org            } else {
1096dd0cd34067d103ace7c6739405cb7885d8ad3fb2mike@reedtribe.org                fNClip = !fNClip;
1097dd0cd34067d103ace7c6739405cb7885d8ad3fb2mike@reedtribe.org                this->inval(NULL);
1098dd0cd34067d103ace7c6739405cb7885d8ad3fb2mike@reedtribe.org            }
10998a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            this->updateTitle();
11008a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            return true;
11018a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        case kDown_SkKey:
1102dd0cd34067d103ace7c6739405cb7885d8ad3fb2mike@reedtribe.org            if (USE_ARROWS_FOR_ZOOM) {
1103dd0cd34067d103ace7c6739405cb7885d8ad3fb2mike@reedtribe.org                this->changeZoomLevel(-1);
1104dd0cd34067d103ace7c6739405cb7885d8ad3fb2mike@reedtribe.org            } else {
1105dd0cd34067d103ace7c6739405cb7885d8ad3fb2mike@reedtribe.org                this->setConfig(cycle_configs(this->getBitmap().config()));
1106dd0cd34067d103ace7c6739405cb7885d8ad3fb2mike@reedtribe.org            }
11078a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            this->updateTitle();
11088a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            return true;
11098a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        case kOK_SkKey:
1110f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com            if (false) {
11118a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                SkDebugfDumper dumper;
11128a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                SkDumpCanvas dc(&dumper);
11138a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                this->draw(&dc);
11148a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            } else {
11158a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                fRepeatDrawing = !fRepeatDrawing;
11168a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                if (fRepeatDrawing) {
11178a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                    this->inval(NULL);
11188a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                }
11198a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            }
11208a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            return true;
112134245c7871f6339de8cc2be8fb1090ca3cba54efreed@android.com        case kBack_SkKey:
112234245c7871f6339de8cc2be8fb1090ca3cba54efreed@android.com            this->loadView(NULL);
112334245c7871f6339de8cc2be8fb1090ca3cba54efreed@android.com            return true;
11248a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        default:
11258a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            break;
11268a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    }
11278a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    return this->INHERITED::onHandleKey(key);
11288a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
11298a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
113052f57e1d11a00bdc5efb96709446546cdbc1ff9dreed@google.com///////////////////////////////////////////////////////////////////////////////
113152f57e1d11a00bdc5efb96709446546cdbc1ff9dreed@google.com
113252f57e1d11a00bdc5efb96709446546cdbc1ff9dreed@google.comstatic const char gGestureClickType[] = "GestureClickType";
113352f57e1d11a00bdc5efb96709446546cdbc1ff9dreed@google.com
1134dd0cd34067d103ace7c6739405cb7885d8ad3fb2mike@reedtribe.orgbool SampleWindow::onDispatchClick(int x, int y, Click::State state) {
11350f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo    if (Click::kMoved_State == state) {
11360f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo        updatePointer(x, y);
11370f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo    }
1138dd0cd34067d103ace7c6739405cb7885d8ad3fb2mike@reedtribe.org    int w = SkScalarRound(this->width());
1139dd0cd34067d103ace7c6739405cb7885d8ad3fb2mike@reedtribe.org    int h = SkScalarRound(this->height());
1140dd0cd34067d103ace7c6739405cb7885d8ad3fb2mike@reedtribe.org
1141dd0cd34067d103ace7c6739405cb7885d8ad3fb2mike@reedtribe.org    // check for the resize-box
1142dd0cd34067d103ace7c6739405cb7885d8ad3fb2mike@reedtribe.org    if (w - x < 16 && h - y < 16) {
1143dd0cd34067d103ace7c6739405cb7885d8ad3fb2mike@reedtribe.org        return false;   // let the OS handle the click
1144dd0cd34067d103ace7c6739405cb7885d8ad3fb2mike@reedtribe.org    } else {
1145dd0cd34067d103ace7c6739405cb7885d8ad3fb2mike@reedtribe.org        return this->INHERITED::onDispatchClick(x, y, state);
1146dd0cd34067d103ace7c6739405cb7885d8ad3fb2mike@reedtribe.org    }
1147dd0cd34067d103ace7c6739405cb7885d8ad3fb2mike@reedtribe.org}
1148dd0cd34067d103ace7c6739405cb7885d8ad3fb2mike@reedtribe.org
114952f57e1d11a00bdc5efb96709446546cdbc1ff9dreed@google.comclass GestureClick : public SkView::Click {
115052f57e1d11a00bdc5efb96709446546cdbc1ff9dreed@google.compublic:
115152f57e1d11a00bdc5efb96709446546cdbc1ff9dreed@google.com    GestureClick(SkView* target) : SkView::Click(target) {
115252f57e1d11a00bdc5efb96709446546cdbc1ff9dreed@google.com        this->setType(gGestureClickType);
115352f57e1d11a00bdc5efb96709446546cdbc1ff9dreed@google.com    }
115452f57e1d11a00bdc5efb96709446546cdbc1ff9dreed@google.com
115552f57e1d11a00bdc5efb96709446546cdbc1ff9dreed@google.com    static bool IsGesture(Click* click) {
115652f57e1d11a00bdc5efb96709446546cdbc1ff9dreed@google.com        return click->isType(gGestureClickType);
115752f57e1d11a00bdc5efb96709446546cdbc1ff9dreed@google.com    }
115852f57e1d11a00bdc5efb96709446546cdbc1ff9dreed@google.com};
115952f57e1d11a00bdc5efb96709446546cdbc1ff9dreed@google.com
116052f57e1d11a00bdc5efb96709446546cdbc1ff9dreed@google.comSkView::Click* SampleWindow::onFindClickHandler(SkScalar x, SkScalar y) {
116152f57e1d11a00bdc5efb96709446546cdbc1ff9dreed@google.com    return new GestureClick(this);
116252f57e1d11a00bdc5efb96709446546cdbc1ff9dreed@google.com}
116352f57e1d11a00bdc5efb96709446546cdbc1ff9dreed@google.com
116452f57e1d11a00bdc5efb96709446546cdbc1ff9dreed@google.combool SampleWindow::onClick(Click* click) {
116552f57e1d11a00bdc5efb96709446546cdbc1ff9dreed@google.com    if (GestureClick::IsGesture(click)) {
116652f57e1d11a00bdc5efb96709446546cdbc1ff9dreed@google.com        float x = SkScalarToFloat(click->fCurr.fX);
116752f57e1d11a00bdc5efb96709446546cdbc1ff9dreed@google.com        float y = SkScalarToFloat(click->fCurr.fY);
116852f57e1d11a00bdc5efb96709446546cdbc1ff9dreed@google.com        switch (click->fState) {
116952f57e1d11a00bdc5efb96709446546cdbc1ff9dreed@google.com            case SkView::Click::kDown_State:
117052f57e1d11a00bdc5efb96709446546cdbc1ff9dreed@google.com                fGesture.touchBegin(click, x, y);
117152f57e1d11a00bdc5efb96709446546cdbc1ff9dreed@google.com                break;
117252f57e1d11a00bdc5efb96709446546cdbc1ff9dreed@google.com            case SkView::Click::kMoved_State:
117352f57e1d11a00bdc5efb96709446546cdbc1ff9dreed@google.com                fGesture.touchMoved(click, x, y);
117452f57e1d11a00bdc5efb96709446546cdbc1ff9dreed@google.com                this->inval(NULL);
117552f57e1d11a00bdc5efb96709446546cdbc1ff9dreed@google.com                break;
117652f57e1d11a00bdc5efb96709446546cdbc1ff9dreed@google.com            case SkView::Click::kUp_State:
117752f57e1d11a00bdc5efb96709446546cdbc1ff9dreed@google.com                fGesture.touchEnd(click);
117852f57e1d11a00bdc5efb96709446546cdbc1ff9dreed@google.com                this->inval(NULL);
117952f57e1d11a00bdc5efb96709446546cdbc1ff9dreed@google.com                break;
118052f57e1d11a00bdc5efb96709446546cdbc1ff9dreed@google.com        }
118152f57e1d11a00bdc5efb96709446546cdbc1ff9dreed@google.com        return true;
118252f57e1d11a00bdc5efb96709446546cdbc1ff9dreed@google.com    }
118352f57e1d11a00bdc5efb96709446546cdbc1ff9dreed@google.com    return false;
118452f57e1d11a00bdc5efb96709446546cdbc1ff9dreed@google.com}
118552f57e1d11a00bdc5efb96709446546cdbc1ff9dreed@google.com
118652f57e1d11a00bdc5efb96709446546cdbc1ff9dreed@google.com///////////////////////////////////////////////////////////////////////////////
118752f57e1d11a00bdc5efb96709446546cdbc1ff9dreed@google.com
11888a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comvoid SampleWindow::loadView(SkView* view) {
11898a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkView::F2BIter iter(this);
11908a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkView* prev = iter.next();
11918a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    if (prev) {
11928a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        prev->detachFromParent();
11938a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    }
11942e7b43d33cc495663cb814a7a9d1ecdc09c31828bsalomon@google.com
119534245c7871f6339de8cc2be8fb1090ca3cba54efreed@android.com    if (NULL == view) {
119634245c7871f6339de8cc2be8fb1090ca3cba54efreed@android.com        view = create_overview(fSamples.count(), fSamples.begin());
119734245c7871f6339de8cc2be8fb1090ca3cba54efreed@android.com    }
11988a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    view->setVisibleP(true);
1199f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com    view->setClipToBounds(false);
12008a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    this->attachChildToFront(view)->unref();
12018a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    view->setSize(this->width(), this->height());
12028a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
12038a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    this->updateTitle();
12048a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
12058a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
12068a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comstatic const char* gConfigNames[] = {
12078a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    "unknown config",
12088a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    "A1",
12098a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    "A8",
12108a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    "Index8",
12118a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    "565",
12128a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    "4444",
12138a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    "8888"
12148a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com};
12158a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
12168a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comstatic const char* configToString(SkBitmap::Config c) {
12178a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    return gConfigNames[c];
12188a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
12198a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
12208a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comstatic const char* gCanvasTypePrefix[] = {
12218a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    "raster: ",
12228a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    "picture: ",
12238a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    "opengl: "
12248a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com};
12258a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1226569e0435af62bdb88a662fa0592f75673a17afd9reed@google.comstatic const char* trystate_str(SkTriState state,
1227569e0435af62bdb88a662fa0592f75673a17afd9reed@google.com                                const char trueStr[], const char falseStr[]) {
1228569e0435af62bdb88a662fa0592f75673a17afd9reed@google.com    if (kTrue_SkTriState == state) {
1229569e0435af62bdb88a662fa0592f75673a17afd9reed@google.com        return trueStr;
1230569e0435af62bdb88a662fa0592f75673a17afd9reed@google.com    } else if (kFalse_SkTriState == state) {
1231569e0435af62bdb88a662fa0592f75673a17afd9reed@google.com        return falseStr;
1232569e0435af62bdb88a662fa0592f75673a17afd9reed@google.com    }
1233569e0435af62bdb88a662fa0592f75673a17afd9reed@google.com    return NULL;
1234569e0435af62bdb88a662fa0592f75673a17afd9reed@google.com}
1235569e0435af62bdb88a662fa0592f75673a17afd9reed@google.com
12368a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comvoid SampleWindow::updateTitle() {
12378a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkString title;
12388a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
12398a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkView::F2BIter iter(this);
12408a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkView* view = iter.next();
12418a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkEvent evt(gTitleEvtName);
12428a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    if (view->doQuery(&evt)) {
12438a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        title.set(evt.findString(gTitleEvtName));
12448a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    }
12458a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    if (title.size() == 0) {
12468a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        title.set("<unknown>");
12478a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    }
12482e7b43d33cc495663cb814a7a9d1ecdc09c31828bsalomon@google.com
12498a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    title.prepend(gCanvasTypePrefix[fCanvasType]);
12508a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
12518a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    title.prepend(" ");
12528a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    title.prepend(configToString(this->getBitmap().config()));
12532e7b43d33cc495663cb814a7a9d1ecdc09c31828bsalomon@google.com
12548a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    if (fAnimating) {
12558a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        title.prepend("<A> ");
12568a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    }
12576c5f6f25b43f1210decb48956c1a2fbe5b58f889reed@android.com    if (fScale) {
12586c5f6f25b43f1210decb48956c1a2fbe5b58f889reed@android.com        title.prepend("<S> ");
12596c5f6f25b43f1210decb48956c1a2fbe5b58f889reed@android.com    }
12606c5f6f25b43f1210decb48956c1a2fbe5b58f889reed@android.com    if (fRotate) {
12616c5f6f25b43f1210decb48956c1a2fbe5b58f889reed@android.com        title.prepend("<R> ");
12626c5f6f25b43f1210decb48956c1a2fbe5b58f889reed@android.com    }
1263e522ca5d5f249bd51a00cb68bb051f811d0a9e85reed@android.com    if (fNClip) {
1264e522ca5d5f249bd51a00cb68bb051f811d0a9e85reed@android.com        title.prepend("<C> ");
1265e522ca5d5f249bd51a00cb68bb051f811d0a9e85reed@android.com    }
1266569e0435af62bdb88a662fa0592f75673a17afd9reed@google.com
1267569e0435af62bdb88a662fa0592f75673a17afd9reed@google.com    title.prepend(trystate_str(fLCDState, "LCD ", "lcd "));
1268569e0435af62bdb88a662fa0592f75673a17afd9reed@google.com    title.prepend(trystate_str(fAAState, "AA ", "aa "));
1269569e0435af62bdb88a662fa0592f75673a17afd9reed@google.com    title.prepend(fFlipAxis & kFlipAxis_X ? "X " : NULL);
1270569e0435af62bdb88a662fa0592f75673a17afd9reed@google.com    title.prepend(fFlipAxis & kFlipAxis_Y ? "Y " : NULL);
1271dd0cd34067d103ace7c6739405cb7885d8ad3fb2mike@reedtribe.org
1272dd0cd34067d103ace7c6739405cb7885d8ad3fb2mike@reedtribe.org    if (fZoomLevel) {
1273dd0cd34067d103ace7c6739405cb7885d8ad3fb2mike@reedtribe.org        title.prependf("{%d} ", fZoomLevel);
1274dd0cd34067d103ace7c6739405cb7885d8ad3fb2mike@reedtribe.org    }
12752eb595292b9624371d1698ae9da7accb4c09c26cmike@reedtribe.org
12762eb595292b9624371d1698ae9da7accb4c09c26cmike@reedtribe.org    if (fMeasureFPS) {
12772eb595292b9624371d1698ae9da7accb4c09c26cmike@reedtribe.org        title.appendf(" %4d ms", fMeasureFPS_Time);
12782eb595292b9624371d1698ae9da7accb4c09c26cmike@reedtribe.org    }
12792eb595292b9624371d1698ae9da7accb4c09c26cmike@reedtribe.org
12808a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    this->setTitle(title.c_str());
12818a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
12828a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
12838a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comvoid SampleWindow::onSizeChange() {
12848a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    this->INHERITED::onSizeChange();
12858a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
12868a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkView::F2BIter iter(this);
12878a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkView* view = iter.next();
12888a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    view->setSize(this->width(), this->height());
12892e7b43d33cc495663cb814a7a9d1ecdc09c31828bsalomon@google.com
12908a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    // rebuild our clippath
12918a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    {
12928a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        const SkScalar W = this->width();
12938a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        const SkScalar H = this->height();
12942e7b43d33cc495663cb814a7a9d1ecdc09c31828bsalomon@google.com
12958a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        fClipPath.reset();
12968a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#if 0
12978a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        for (SkScalar y = SK_Scalar1; y < H; y += SkIntToScalar(32)) {
12988a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            SkRect r;
12998a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            r.set(SK_Scalar1, y, SkIntToScalar(30), y + SkIntToScalar(30));
13008a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            for (; r.fLeft < W; r.offset(SkIntToScalar(32), 0))
13018a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                fClipPath.addRect(r);
13028a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        }
13038a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#else
13048a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        SkRect r;
13058a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        r.set(0, 0, W, H);
13068a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        fClipPath.addRect(r, SkPath::kCCW_Direction);
13078a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        r.set(W/4, H/4, W*3/4, H*3/4);
13088a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        fClipPath.addRect(r, SkPath::kCW_Direction);
13098a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#endif
13108a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    }
13112e7b43d33cc495663cb814a7a9d1ecdc09c31828bsalomon@google.com
13128a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    this->updateTitle();    // to refresh our config
13138a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
13148a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
13158a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com///////////////////////////////////////////////////////////////////////////////
13168a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
13172eb595292b9624371d1698ae9da7accb4c09c26cmike@reedtribe.orgstatic const char repeat_count_tag[] = "sample-set-repeat-count";
13182eb595292b9624371d1698ae9da7accb4c09c26cmike@reedtribe.org
1319f21833999d90ad9c8c584cff3238797b39cfc00breed@google.combool SampleView::SetRepeatDraw(SkView* view, int count) {
13202eb595292b9624371d1698ae9da7accb4c09c26cmike@reedtribe.org    SkEvent evt(repeat_count_tag);
13212eb595292b9624371d1698ae9da7accb4c09c26cmike@reedtribe.org    evt.setFast32(count);
1322f21833999d90ad9c8c584cff3238797b39cfc00breed@google.com    return view->doEvent(evt);
13232eb595292b9624371d1698ae9da7accb4c09c26cmike@reedtribe.org}
13242eb595292b9624371d1698ae9da7accb4c09c26cmike@reedtribe.org
13252eb595292b9624371d1698ae9da7accb4c09c26cmike@reedtribe.orgbool SampleView::onEvent(const SkEvent& evt) {
13262eb595292b9624371d1698ae9da7accb4c09c26cmike@reedtribe.org    if (evt.isType(repeat_count_tag)) {
13272eb595292b9624371d1698ae9da7accb4c09c26cmike@reedtribe.org        fRepeatCount = evt.getFast32();
13282eb595292b9624371d1698ae9da7accb4c09c26cmike@reedtribe.org        return true;
13292eb595292b9624371d1698ae9da7accb4c09c26cmike@reedtribe.org    }
13302eb595292b9624371d1698ae9da7accb4c09c26cmike@reedtribe.org    return this->INHERITED::onEvent(evt);
13312eb595292b9624371d1698ae9da7accb4c09c26cmike@reedtribe.org}
13322eb595292b9624371d1698ae9da7accb4c09c26cmike@reedtribe.org
13332eb595292b9624371d1698ae9da7accb4c09c26cmike@reedtribe.orgbool SampleView::onQuery(SkEvent* evt) {
13342eb595292b9624371d1698ae9da7accb4c09c26cmike@reedtribe.org    return this->INHERITED::onQuery(evt);
13352eb595292b9624371d1698ae9da7accb4c09c26cmike@reedtribe.org}
13362eb595292b9624371d1698ae9da7accb4c09c26cmike@reedtribe.org
13374aebe4fb10ebdfe81192f46906ca53cf6033a467reed@google.com#define TEST_GPIPEx
133864e3eb24e52a84613ff8c1da5dac6f4b5ba38320reed@google.com
133968f456d5686c8edbd3da6e7169a983306cc5ee39reed@google.com#ifdef TEST_GPIPE
134068f456d5686c8edbd3da6e7169a983306cc5ee39reed@google.com    #include "SkGPipe.h"
134164e3eb24e52a84613ff8c1da5dac6f4b5ba38320reed@google.com
134264e3eb24e52a84613ff8c1da5dac6f4b5ba38320reed@google.comclass SimplePC : public SkGPipeController {
134364e3eb24e52a84613ff8c1da5dac6f4b5ba38320reed@google.compublic:
134464e3eb24e52a84613ff8c1da5dac6f4b5ba38320reed@google.com    SimplePC(SkCanvas* target);
134564e3eb24e52a84613ff8c1da5dac6f4b5ba38320reed@google.com    ~SimplePC();
134664e3eb24e52a84613ff8c1da5dac6f4b5ba38320reed@google.com
134764e3eb24e52a84613ff8c1da5dac6f4b5ba38320reed@google.com    virtual void* requestBlock(size_t minRequest, size_t* actual);
134864e3eb24e52a84613ff8c1da5dac6f4b5ba38320reed@google.com    virtual void notifyWritten(size_t bytes);
134964e3eb24e52a84613ff8c1da5dac6f4b5ba38320reed@google.com
135064e3eb24e52a84613ff8c1da5dac6f4b5ba38320reed@google.comprivate:
1351961ddb04a0a7aba843032d829ab867518e52559ereed@google.com    SkGPipeReader   fReader;
1352961ddb04a0a7aba843032d829ab867518e52559ereed@google.com    void*           fBlock;
1353961ddb04a0a7aba843032d829ab867518e52559ereed@google.com    size_t          fBlockSize;
1354961ddb04a0a7aba843032d829ab867518e52559ereed@google.com    size_t          fBytesWritten;
1355961ddb04a0a7aba843032d829ab867518e52559ereed@google.com    int             fAtomsWritten;
135664e3eb24e52a84613ff8c1da5dac6f4b5ba38320reed@google.com    SkGPipeReader::Status   fStatus;
135764e3eb24e52a84613ff8c1da5dac6f4b5ba38320reed@google.com
135864e3eb24e52a84613ff8c1da5dac6f4b5ba38320reed@google.com    size_t        fTotalWritten;
135964e3eb24e52a84613ff8c1da5dac6f4b5ba38320reed@google.com};
136064e3eb24e52a84613ff8c1da5dac6f4b5ba38320reed@google.com
136164e3eb24e52a84613ff8c1da5dac6f4b5ba38320reed@google.comSimplePC::SimplePC(SkCanvas* target) : fReader(target) {
136264e3eb24e52a84613ff8c1da5dac6f4b5ba38320reed@google.com    fBlock = NULL;
136364e3eb24e52a84613ff8c1da5dac6f4b5ba38320reed@google.com    fBlockSize = fBytesWritten = 0;
136464e3eb24e52a84613ff8c1da5dac6f4b5ba38320reed@google.com    fStatus = SkGPipeReader::kDone_Status;
136564e3eb24e52a84613ff8c1da5dac6f4b5ba38320reed@google.com    fTotalWritten = 0;
1366961ddb04a0a7aba843032d829ab867518e52559ereed@google.com    fAtomsWritten = 0;
136764e3eb24e52a84613ff8c1da5dac6f4b5ba38320reed@google.com}
136864e3eb24e52a84613ff8c1da5dac6f4b5ba38320reed@google.com
136964e3eb24e52a84613ff8c1da5dac6f4b5ba38320reed@google.comSimplePC::~SimplePC() {
137064e3eb24e52a84613ff8c1da5dac6f4b5ba38320reed@google.com//    SkASSERT(SkGPipeReader::kDone_Status == fStatus);
137164e3eb24e52a84613ff8c1da5dac6f4b5ba38320reed@google.com    sk_free(fBlock);
137264e3eb24e52a84613ff8c1da5dac6f4b5ba38320reed@google.com
1373961ddb04a0a7aba843032d829ab867518e52559ereed@google.com    SkDebugf("--- %d bytes %d atoms, status %d\n", fTotalWritten,
1374961ddb04a0a7aba843032d829ab867518e52559ereed@google.com             fAtomsWritten, fStatus);
137564e3eb24e52a84613ff8c1da5dac6f4b5ba38320reed@google.com}
137664e3eb24e52a84613ff8c1da5dac6f4b5ba38320reed@google.com
137764e3eb24e52a84613ff8c1da5dac6f4b5ba38320reed@google.comvoid* SimplePC::requestBlock(size_t minRequest, size_t* actual) {
137864e3eb24e52a84613ff8c1da5dac6f4b5ba38320reed@google.com    sk_free(fBlock);
137964e3eb24e52a84613ff8c1da5dac6f4b5ba38320reed@google.com
138064e3eb24e52a84613ff8c1da5dac6f4b5ba38320reed@google.com    fBlockSize = minRequest * 4;
138164e3eb24e52a84613ff8c1da5dac6f4b5ba38320reed@google.com    fBlock = sk_malloc_throw(fBlockSize);
138264e3eb24e52a84613ff8c1da5dac6f4b5ba38320reed@google.com    fBytesWritten = 0;
138364e3eb24e52a84613ff8c1da5dac6f4b5ba38320reed@google.com    *actual = fBlockSize;
138464e3eb24e52a84613ff8c1da5dac6f4b5ba38320reed@google.com    return fBlock;
138564e3eb24e52a84613ff8c1da5dac6f4b5ba38320reed@google.com}
138664e3eb24e52a84613ff8c1da5dac6f4b5ba38320reed@google.com
138764e3eb24e52a84613ff8c1da5dac6f4b5ba38320reed@google.comvoid SimplePC::notifyWritten(size_t bytes) {
138864e3eb24e52a84613ff8c1da5dac6f4b5ba38320reed@google.com    SkASSERT(fBytesWritten + bytes <= fBlockSize);
138964e3eb24e52a84613ff8c1da5dac6f4b5ba38320reed@google.com
139064e3eb24e52a84613ff8c1da5dac6f4b5ba38320reed@google.com    fStatus = fReader.playback((const char*)fBlock + fBytesWritten, bytes);
139164e3eb24e52a84613ff8c1da5dac6f4b5ba38320reed@google.com    SkASSERT(SkGPipeReader::kError_Status != fStatus);
139264e3eb24e52a84613ff8c1da5dac6f4b5ba38320reed@google.com    fBytesWritten += bytes;
139364e3eb24e52a84613ff8c1da5dac6f4b5ba38320reed@google.com    fTotalWritten += bytes;
1394961ddb04a0a7aba843032d829ab867518e52559ereed@google.com
1395961ddb04a0a7aba843032d829ab867518e52559ereed@google.com    fAtomsWritten += 1;
139664e3eb24e52a84613ff8c1da5dac6f4b5ba38320reed@google.com}
139764e3eb24e52a84613ff8c1da5dac6f4b5ba38320reed@google.com
139868f456d5686c8edbd3da6e7169a983306cc5ee39reed@google.com#endif
13992f3dc9dc4c970bd066be329a842a791d91f524e2reed@google.com
140064e3eb24e52a84613ff8c1da5dac6f4b5ba38320reed@google.com
14012eb595292b9624371d1698ae9da7accb4c09c26cmike@reedtribe.orgvoid SampleView::onDraw(SkCanvas* canvas) {
14022eb595292b9624371d1698ae9da7accb4c09c26cmike@reedtribe.org    this->onDrawBackground(canvas);
14032f3dc9dc4c970bd066be329a842a791d91f524e2reed@google.com
14042f3dc9dc4c970bd066be329a842a791d91f524e2reed@google.com#ifdef TEST_GPIPE
140564e3eb24e52a84613ff8c1da5dac6f4b5ba38320reed@google.com    SimplePC controller(canvas);
14062f3dc9dc4c970bd066be329a842a791d91f524e2reed@google.com    SkGPipeWriter writer;
140764e3eb24e52a84613ff8c1da5dac6f4b5ba38320reed@google.com    canvas = writer.startRecording(&controller);
14082f3dc9dc4c970bd066be329a842a791d91f524e2reed@google.com#endif
14092f3dc9dc4c970bd066be329a842a791d91f524e2reed@google.com
14102eb595292b9624371d1698ae9da7accb4c09c26cmike@reedtribe.org    for (int i = 0; i < fRepeatCount; i++) {
14112eb595292b9624371d1698ae9da7accb4c09c26cmike@reedtribe.org        SkAutoCanvasRestore acr(canvas, true);
14122eb595292b9624371d1698ae9da7accb4c09c26cmike@reedtribe.org        this->onDrawContent(canvas);
14132eb595292b9624371d1698ae9da7accb4c09c26cmike@reedtribe.org    }
14142eb595292b9624371d1698ae9da7accb4c09c26cmike@reedtribe.org}
14152eb595292b9624371d1698ae9da7accb4c09c26cmike@reedtribe.org
14162eb595292b9624371d1698ae9da7accb4c09c26cmike@reedtribe.orgvoid SampleView::onDrawBackground(SkCanvas* canvas) {
1417f21833999d90ad9c8c584cff3238797b39cfc00breed@google.com    canvas->drawColor(fBGColor);
14182eb595292b9624371d1698ae9da7accb4c09c26cmike@reedtribe.org}
14192eb595292b9624371d1698ae9da7accb4c09c26cmike@reedtribe.org
14202eb595292b9624371d1698ae9da7accb4c09c26cmike@reedtribe.org///////////////////////////////////////////////////////////////////////////////
14212eb595292b9624371d1698ae9da7accb4c09c26cmike@reedtribe.org
1422f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.comtemplate <typename T> void SkTBSort(T array[], int count) {
1423f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com    for (int i = 1; i < count - 1; i++) {
1424f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com        bool didSwap = false;
1425f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com        for (int j = count - 1; j > i; --j) {
1426f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com            if (array[j] < array[j-1]) {
1427f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com                T tmp(array[j-1]);
1428f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com                array[j-1] = array[j];
1429f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com                array[j] = tmp;
1430f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com                didSwap = true;
1431f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com            }
1432f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com        }
1433f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com        if (!didSwap) {
1434f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com            break;
1435f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com        }
1436f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com    }
14372e7b43d33cc495663cb814a7a9d1ecdc09c31828bsalomon@google.com
1438f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com    for (int k = 0; k < count - 1; k++) {
1439f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com        SkASSERT(!(array[k+1] < array[k]));
1440f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com    }
1441f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com}
1442f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com
1443f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com#include "SkRandom.h"
1444f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com
1445f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.comstatic void rand_rect(SkIRect* rect, SkRandom& rand) {
1446f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com    int bits = 8;
1447f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com    int shift = 32 - bits;
1448f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com    rect->set(rand.nextU() >> shift, rand.nextU() >> shift,
1449f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com              rand.nextU() >> shift, rand.nextU() >> shift);
1450f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com    rect->sort();
1451f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com}
1452f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com
1453f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.comstatic void dumpRect(const SkIRect& r) {
1454f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com    SkDebugf(" { %d, %d, %d, %d },\n",
1455f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com             r.fLeft, r.fTop,
1456f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com             r.fRight, r.fBottom);
1457f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com}
1458f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com
1459f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.comstatic void test_rects(const SkIRect rect[], int count) {
1460f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com    SkRegion rgn0, rgn1;
1461f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com
1462f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com    for (int i = 0; i < count; i++) {
1463f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com        rgn0.op(rect[i], SkRegion::kUnion_Op);
1464f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com     //   dumpRect(rect[i]);
1465f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com    }
1466f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com    rgn1.setRects(rect, count);
1467f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com
1468f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com    if (rgn0 != rgn1) {
1469f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com        SkDebugf("\n");
1470f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com        for (int i = 0; i < count; i++) {
1471f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com            dumpRect(rect[i]);
1472f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com        }
1473f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com        SkDebugf("\n");
1474f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com    }
1475f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com}
1476f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com
1477f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.comstatic void test() {
1478f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com    size_t i;
1479f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com
1480f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com    const SkIRect r0[] = {
1481f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com        { 0, 0, 1, 1 },
1482f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com        { 2, 2, 3, 3 },
1483f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com    };
1484f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com    const SkIRect r1[] = {
1485f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com        { 0, 0, 1, 3 },
1486f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com        { 1, 1, 2, 2 },
1487f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com        { 2, 0, 3, 3 },
1488f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com    };
1489f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com    const SkIRect r2[] = {
1490f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com        { 0, 0, 1, 2 },
1491f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com        { 2, 1, 3, 3 },
1492f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com        { 4, 0, 5, 1 },
1493f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com        { 6, 0, 7, 4 },
1494f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com    };
1495f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com
1496f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com    static const struct {
1497f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com        const SkIRect* fRects;
1498f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com        int            fCount;
1499f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com    } gRecs[] = {
1500f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com        { r0, SK_ARRAY_COUNT(r0) },
1501f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com        { r1, SK_ARRAY_COUNT(r1) },
1502f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com        { r2, SK_ARRAY_COUNT(r2) },
1503f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com    };
1504f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com
1505f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com    for (i = 0; i < SK_ARRAY_COUNT(gRecs); i++) {
1506f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com        test_rects(gRecs[i].fRects, gRecs[i].fCount);
1507f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com    }
15082e7b43d33cc495663cb814a7a9d1ecdc09c31828bsalomon@google.com
1509f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com    SkRandom rand;
1510f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com    for (i = 0; i < 10000; i++) {
1511f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com        SkRegion rgn0, rgn1;
1512f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com
1513f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com        const int N = 8;
1514f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com        SkIRect rect[N];
1515f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com        for (int j = 0; j < N; j++) {
1516f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com            rand_rect(&rect[j], rand);
1517f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com        }
1518f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com        test_rects(rect, N);
1519f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com    }
1520f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com}
1521f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com
15228a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comSkOSWindow* create_sk_window(void* hwnd) {
1523f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com//    test();
15242fbc7fa460c99bffa78b9afb9aaa4dc0db68e1babsalomon@google.com    return new SampleWindow(hwnd);
15258a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
15268a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
15278a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comvoid get_preferred_size(int* x, int* y, int* width, int* height) {
15288a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    *x = 10;
15298a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    *y = 50;
15308a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    *width = 640;
15318a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    *height = 480;
15328a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
15338a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
15348a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comvoid application_init() {
15358a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com//    setenv("ANDROID_ROOT", "../../../data", 0);
1536e191b16fda2f5afea3a90653c1cd4f5a3c436e89reed@android.com#ifdef SK_BUILD_FOR_MAC
15378a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    setenv("ANDROID_ROOT", "/android/device/data", 0);
1538e191b16fda2f5afea3a90653c1cd4f5a3c436e89reed@android.com#endif
15392fbc7fa460c99bffa78b9afb9aaa4dc0db68e1babsalomon@google.com    SkGraphics::Init();
15402fbc7fa460c99bffa78b9afb9aaa4dc0db68e1babsalomon@google.com    SkEvent::Init();
15418a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
15428a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
15438a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comvoid application_term() {
15442fbc7fa460c99bffa78b9afb9aaa4dc0db68e1babsalomon@google.com    SkEvent::Term();
15452fbc7fa460c99bffa78b9afb9aaa4dc0db68e1babsalomon@google.com    SkGraphics::Term();
15468a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
1547