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, ¢er); 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