1ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com/*
2ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Copyright 2011 Google Inc.
3ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com *
4ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Use of this source code is governed by a BSD-style license that can be
5ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * found in the LICENSE file.
6ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com */
7868074b50b0fc3e460d2aa97c1096827fe0a1935reed
82c8208f3a444098aee562f5a1ef620142807eda2Scroggo#include "SampleApp.h"
92c8208f3a444098aee562f5a1ef620142807eda2Scroggo
10bcbc1788b478b1e54079318ad073e8490aa66faetfarina#include "OverView.h"
11f568f6a557dbc5a6b2f99b3747340ff7d36da26bcaryclark#include "Resources.h"
12bcbc1788b478b1e54079318ad073e8490aa66faetfarina#include "SampleCode.h"
13bcbc1788b478b1e54079318ad073e8490aa66faetfarina#include "SamplePipeControllers.h"
1476113a9b7716748c70ea0ecf7aacbabe4cce5009reed#include "SkAnimTimer.h"
158a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkCanvas.h"
16bcbc1788b478b1e54079318ad073e8490aa66faetfarina#include "SkCommandLineFlags.h"
17bcbc1788b478b1e54079318ad073e8490aa66faetfarina#include "SkData.h"
18beedb81a7fa9bd1274d64b2c000ef6ee23c9a810reed#include "SkDeferredCanvas.h"
198a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkDevice.h"
20ddb5eca198736a320b8318eb5f6dfd6d0b6ad1d3reed#include "SkDocument.h"
21bcbc1788b478b1e54079318ad073e8490aa66faetfarina#include "SkGPipe.h"
228a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkGraphics.h"
23b08eb2b3bce45411494fe00258e4c91248ccd15ereed@android.com#include "SkImageEncoder.h"
24bcbc1788b478b1e54079318ad073e8490aa66faetfarina#include "SkOSFile.h"
258a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkPaint.h"
268a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkPicture.h"
27770963f23f4fc313db0fa3bac18b1b8aafb55f17robertphillips@google.com#include "SkPictureRecorder.h"
288a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkStream.h"
299a558d495dfe305a52946cdf97e8883190e0bbcccommit-bot@chromium.org#include "SkSurface.h"
30f8b6b01d51d08e39499d1c88063af2964fe72a0fedisonn@google.com#include "SkTSort.h"
314417740a480786ca65379ba5b398c500ba34ee18reed@android.com#include "SkTime.h"
320f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo#include "SkTypeface.h"
33bcbc1788b478b1e54079318ad073e8490aa66faetfarina#include "SkWindow.h"
34bcbc1788b478b1e54079318ad073e8490aa66faetfarina#include "sk_tool_utils.h"
35f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com
36cf8fb1f6f03fc77f9927564f9ef9abeeeec508d2bsalomon@google.com#if SK_SUPPORT_GPU
376bf38b59c9de1cd35cd091cf8766117f4e1f66a0tomhudson@google.com#include "gl/GrGLInterface.h"
389c1f1ac5d399c73f5f331bdf7b392ea7f0c44dafbsalomon@google.com#include "gl/GrGLUtil.h"
39583a1e38503ebd57ba9bd39a3fabe89bead8e76cbsalomon@google.com#include "GrRenderTarget.h"
40cf8fb1f6f03fc77f9927564f9ef9abeeeec508d2bsalomon@google.com#include "GrContext.h"
41cf8fb1f6f03fc77f9927564f9ef9abeeeec508d2bsalomon@google.com#include "SkGpuDevice.h"
42cf8fb1f6f03fc77f9927564f9ef9abeeeec508d2bsalomon@google.com#else
43cf8fb1f6f03fc77f9927564f9ef9abeeeec508d2bsalomon@google.comclass GrContext;
44cf8fb1f6f03fc77f9927564f9ef9abeeeec508d2bsalomon@google.com#endif
452c8208f3a444098aee562f5a1ef620142807eda2Scroggo
461830c7aa3c4045af438fb24ee0bd22598f1bfca7reed@google.comextern SampleView* CreateSamplePictFileView(const char filename[]);
471830c7aa3c4045af438fb24ee0bd22598f1bfca7reed@google.com
481830c7aa3c4045af438fb24ee0bd22598f1bfca7reed@google.comclass PictFileFactory : public SkViewFactory {
491830c7aa3c4045af438fb24ee0bd22598f1bfca7reed@google.com    SkString fFilename;
501830c7aa3c4045af438fb24ee0bd22598f1bfca7reed@google.compublic:
511830c7aa3c4045af438fb24ee0bd22598f1bfca7reed@google.com    PictFileFactory(const SkString& filename) : fFilename(filename) {}
5236352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    SkView* operator() () const override {
531830c7aa3c4045af438fb24ee0bd22598f1bfca7reed@google.com        return CreateSamplePictFileView(fFilename.c_str());
541830c7aa3c4045af438fb24ee0bd22598f1bfca7reed@google.com    }
551830c7aa3c4045af438fb24ee0bd22598f1bfca7reed@google.com};
561830c7aa3c4045af438fb24ee0bd22598f1bfca7reed@google.com
57f8b6b01d51d08e39499d1c88063af2964fe72a0fedisonn@google.com#ifdef SAMPLE_PDF_FILE_VIEWER
58f8b6b01d51d08e39499d1c88063af2964fe72a0fedisonn@google.comextern SampleView* CreateSamplePdfFileViewer(const char filename[]);
59f8b6b01d51d08e39499d1c88063af2964fe72a0fedisonn@google.com
60f8b6b01d51d08e39499d1c88063af2964fe72a0fedisonn@google.comclass PdfFileViewerFactory : public SkViewFactory {
61f8b6b01d51d08e39499d1c88063af2964fe72a0fedisonn@google.com    SkString fFilename;
62f8b6b01d51d08e39499d1c88063af2964fe72a0fedisonn@google.compublic:
63f8b6b01d51d08e39499d1c88063af2964fe72a0fedisonn@google.com    PdfFileViewerFactory(const SkString& filename) : fFilename(filename) {}
6436352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    SkView* operator() () const override {
65f8b6b01d51d08e39499d1c88063af2964fe72a0fedisonn@google.com        return CreateSamplePdfFileViewer(fFilename.c_str());
66f8b6b01d51d08e39499d1c88063af2964fe72a0fedisonn@google.com    }
67f8b6b01d51d08e39499d1c88063af2964fe72a0fedisonn@google.com};
68f8b6b01d51d08e39499d1c88063af2964fe72a0fedisonn@google.com#endif  // SAMPLE_PDF_FILE_VIEWER
69f8b6b01d51d08e39499d1c88063af2964fe72a0fedisonn@google.com
70db03eaa37111a63835ab7f61cb550971e609a621yangsu@google.com#define PIPE_FILEx
71db03eaa37111a63835ab7f61cb550971e609a621yangsu@google.com#ifdef  PIPE_FILE
721f3942110a6fcec86eb411b49eab16d2bd91eb5byangsu@google.com#define FILE_PATH "/path/to/drawing.data"
731f3942110a6fcec86eb411b49eab16d2bd91eb5byangsu@google.com#endif
741f3942110a6fcec86eb411b49eab16d2bd91eb5byangsu@google.com
75f121b0525485fb18e96c4b9dbc57594c430e42f4yangsu@google.com#define PIPE_NETx
76db03eaa37111a63835ab7f61cb550971e609a621yangsu@google.com#ifdef  PIPE_NET
77db03eaa37111a63835ab7f61cb550971e609a621yangsu@google.com#include "SkSockets.h"
78db03eaa37111a63835ab7f61cb550971e609a621yangsu@google.comSkTCPServer gServer;
79db03eaa37111a63835ab7f61cb550971e609a621yangsu@google.com#endif
80ef7bdfac618f60e9edc9f42cd4661d563937e6d8yangsu@google.com
81b442a6d5726569364e15c3056bbfb59b9b6e38cerobertphillips@google.com#if SK_ANGLE
82b442a6d5726569364e15c3056bbfb59b9b6e38cerobertphillips@google.com//#define DEFAULT_TO_ANGLE 1
83b442a6d5726569364e15c3056bbfb59b9b6e38cerobertphillips@google.com#else
8482d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com#define DEFAULT_TO_GPU 0 // if 1 default rendering is on GPU
85b442a6d5726569364e15c3056bbfb59b9b6e38cerobertphillips@google.com#endif
86f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com
878a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#define ANIMATING_EVENTTYPE "nextSample"
8884cfce14fec1f963fedaa3c81b8f3faccd3db13areed@google.com#define ANIMATING_DELAY     250
898a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
902eb595292b9624371d1698ae9da7accb4c09c26cmike@reedtribe.org#ifdef SK_DEBUG
91bad8c87812234117d3dc411382fca60e2e868477reed@google.com    #define FPS_REPEAT_MULTIPLIER   1
922eb595292b9624371d1698ae9da7accb4c09c26cmike@reedtribe.org#else
93bad8c87812234117d3dc411382fca60e2e868477reed@google.com    #define FPS_REPEAT_MULTIPLIER   10
942eb595292b9624371d1698ae9da7accb4c09c26cmike@reedtribe.org#endif
95bad8c87812234117d3dc411382fca60e2e868477reed@google.com#define FPS_REPEAT_COUNT    (10 * FPS_REPEAT_MULTIPLIER)
962eb595292b9624371d1698ae9da7accb4c09c26cmike@reedtribe.org
973cec4d71e6f53fda99705427f9820d025cfbf64breed@google.comstatic SampleWindow* gSampleWindow;
983cec4d71e6f53fda99705427f9820d025cfbf64breed@google.com
99a4f8137e67e31390b0e7edc5e637a3a02495d1a2reed@google.comstatic bool gShowGMBounds;
100a4f8137e67e31390b0e7edc5e637a3a02495d1a2reed@google.com
1016de4a7836f1c7988b42cbbfe1a339ef7619aed8fcommit-bot@chromium.orgstatic void post_event_to_sink(SkEvent* evt, SkEventSink* sink) {
1022072db89016c4e53a648f4d4cec08b1d6be8558creed@google.com    evt->setTargetID(sink->getSinkID())->post();
1032072db89016c4e53a648f4d4cec08b1d6be8558creed@google.com}
1042072db89016c4e53a648f4d4cec08b1d6be8558creed@google.com
10576113a9b7716748c70ea0ecf7aacbabe4cce5009reedstatic SkAnimTimer gAnimTimer;
10676113a9b7716748c70ea0ecf7aacbabe4cce5009reed
1076f6e8c39a7b07f8a916a60ad27f17bd13f3c89admike@reedtribe.org///////////////////////////////////////////////////////////////////////////////
1086f6e8c39a7b07f8a916a60ad27f17bd13f3c89admike@reedtribe.org
1096f6e8c39a7b07f8a916a60ad27f17bd13f3c89admike@reedtribe.orgstatic const char* skip_until(const char* str, const char* skip) {
1106f6e8c39a7b07f8a916a60ad27f17bd13f3c89admike@reedtribe.org    if (!str) {
1116f6e8c39a7b07f8a916a60ad27f17bd13f3c89admike@reedtribe.org        return NULL;
1126f6e8c39a7b07f8a916a60ad27f17bd13f3c89admike@reedtribe.org    }
1136f6e8c39a7b07f8a916a60ad27f17bd13f3c89admike@reedtribe.org    return strstr(str, skip);
1146f6e8c39a7b07f8a916a60ad27f17bd13f3c89admike@reedtribe.org}
1156f6e8c39a7b07f8a916a60ad27f17bd13f3c89admike@reedtribe.org
1166f6e8c39a7b07f8a916a60ad27f17bd13f3c89admike@reedtribe.orgstatic const char* skip_past(const char* str, const char* skip) {
1176f6e8c39a7b07f8a916a60ad27f17bd13f3c89admike@reedtribe.org    const char* found = skip_until(str, skip);
1186f6e8c39a7b07f8a916a60ad27f17bd13f3c89admike@reedtribe.org    if (!found) {
1196f6e8c39a7b07f8a916a60ad27f17bd13f3c89admike@reedtribe.org        return NULL;
1206f6e8c39a7b07f8a916a60ad27f17bd13f3c89admike@reedtribe.org    }
1216f6e8c39a7b07f8a916a60ad27f17bd13f3c89admike@reedtribe.org    return found + strlen(skip);
1226f6e8c39a7b07f8a916a60ad27f17bd13f3c89admike@reedtribe.org}
1236f6e8c39a7b07f8a916a60ad27f17bd13f3c89admike@reedtribe.org
1246f6e8c39a7b07f8a916a60ad27f17bd13f3c89admike@reedtribe.orgstatic const char* gPrefFileName = "sampleapp_prefs.txt";
1256f6e8c39a7b07f8a916a60ad27f17bd13f3c89admike@reedtribe.org
1266fc7cc23a9c33960b879f69d92d6fb0e1373e556epoger@google.comstatic bool readTitleFromPrefs(SkString* title) {
1276f6e8c39a7b07f8a916a60ad27f17bd13f3c89admike@reedtribe.org    SkFILEStream stream(gPrefFileName);
1286f6e8c39a7b07f8a916a60ad27f17bd13f3c89admike@reedtribe.org    if (!stream.isValid()) {
1296f6e8c39a7b07f8a916a60ad27f17bd13f3c89admike@reedtribe.org        return false;
1306f6e8c39a7b07f8a916a60ad27f17bd13f3c89admike@reedtribe.org    }
1316f6e8c39a7b07f8a916a60ad27f17bd13f3c89admike@reedtribe.org
1327fa2a65c0cfc714364490cb715171461143024e0reed@google.com    size_t len = stream.getLength();
1336f6e8c39a7b07f8a916a60ad27f17bd13f3c89admike@reedtribe.org    SkString data(len);
1346f6e8c39a7b07f8a916a60ad27f17bd13f3c89admike@reedtribe.org    stream.read(data.writable_str(), len);
1356f6e8c39a7b07f8a916a60ad27f17bd13f3c89admike@reedtribe.org    const char* s = data.c_str();
1366f6e8c39a7b07f8a916a60ad27f17bd13f3c89admike@reedtribe.org
1376f6e8c39a7b07f8a916a60ad27f17bd13f3c89admike@reedtribe.org    s = skip_past(s, "curr-slide-title");
1386f6e8c39a7b07f8a916a60ad27f17bd13f3c89admike@reedtribe.org    s = skip_past(s, "=");
1396f6e8c39a7b07f8a916a60ad27f17bd13f3c89admike@reedtribe.org    s = skip_past(s, "\"");
1406f6e8c39a7b07f8a916a60ad27f17bd13f3c89admike@reedtribe.org    const char* stop = skip_until(s, "\"");
1416f6e8c39a7b07f8a916a60ad27f17bd13f3c89admike@reedtribe.org    if (stop > s) {
1426f6e8c39a7b07f8a916a60ad27f17bd13f3c89admike@reedtribe.org        title->set(s, stop - s);
1436f6e8c39a7b07f8a916a60ad27f17bd13f3c89admike@reedtribe.org        return true;
1446f6e8c39a7b07f8a916a60ad27f17bd13f3c89admike@reedtribe.org    }
1456f6e8c39a7b07f8a916a60ad27f17bd13f3c89admike@reedtribe.org    return false;
1466f6e8c39a7b07f8a916a60ad27f17bd13f3c89admike@reedtribe.org}
1476f6e8c39a7b07f8a916a60ad27f17bd13f3c89admike@reedtribe.org
1486fc7cc23a9c33960b879f69d92d6fb0e1373e556epoger@google.comstatic void writeTitleToPrefs(const char* title) {
1496f6e8c39a7b07f8a916a60ad27f17bd13f3c89admike@reedtribe.org    SkFILEWStream stream(gPrefFileName);
1506f6e8c39a7b07f8a916a60ad27f17bd13f3c89admike@reedtribe.org    SkString data;
1516f6e8c39a7b07f8a916a60ad27f17bd13f3c89admike@reedtribe.org    data.printf("curr-slide-title = \"%s\"\n", title);
1526f6e8c39a7b07f8a916a60ad27f17bd13f3c89admike@reedtribe.org    stream.write(data.c_str(), data.size());
1536f6e8c39a7b07f8a916a60ad27f17bd13f3c89admike@reedtribe.org}
1546f6e8c39a7b07f8a916a60ad27f17bd13f3c89admike@reedtribe.org
1556f6e8c39a7b07f8a916a60ad27f17bd13f3c89admike@reedtribe.org///////////////////////////////////////////////////////////////////////////////
1566f6e8c39a7b07f8a916a60ad27f17bd13f3c89admike@reedtribe.org
157098e96df6ab0327f18537c7006ff2b0b4116ee30bsalomon@google.comclass SampleWindow::DefaultDeviceManager : public SampleWindow::DeviceManager {
158098e96df6ab0327f18537c7006ff2b0b4116ee30bsalomon@google.compublic:
159098e96df6ab0327f18537c7006ff2b0b4116ee30bsalomon@google.com
160cf8fb1f6f03fc77f9927564f9ef9abeeeec508d2bsalomon@google.com    DefaultDeviceManager() {
161cf8fb1f6f03fc77f9927564f9ef9abeeeec508d2bsalomon@google.com#if SK_SUPPORT_GPU
162cf8fb1f6f03fc77f9927564f9ef9abeeeec508d2bsalomon@google.com        fCurContext = NULL;
163cf8fb1f6f03fc77f9927564f9ef9abeeeec508d2bsalomon@google.com        fCurIntf = NULL;
164cf8fb1f6f03fc77f9927564f9ef9abeeeec508d2bsalomon@google.com        fCurRenderTarget = NULL;
165cf8fb1f6f03fc77f9927564f9ef9abeeeec508d2bsalomon@google.com        fMSAASampleCount = 0;
166cf8fb1f6f03fc77f9927564f9ef9abeeeec508d2bsalomon@google.com#endif
167cf8fb1f6f03fc77f9927564f9ef9abeeeec508d2bsalomon@google.com        fBackend = kNone_BackEndType;
168098e96df6ab0327f18537c7006ff2b0b4116ee30bsalomon@google.com    }
169098e96df6ab0327f18537c7006ff2b0b4116ee30bsalomon@google.com
170098e96df6ab0327f18537c7006ff2b0b4116ee30bsalomon@google.com    virtual ~DefaultDeviceManager() {
171cf8fb1f6f03fc77f9927564f9ef9abeeeec508d2bsalomon@google.com#if SK_SUPPORT_GPU
172b442a6d5726569364e15c3056bbfb59b9b6e38cerobertphillips@google.com        SkSafeUnref(fCurContext);
173b442a6d5726569364e15c3056bbfb59b9b6e38cerobertphillips@google.com        SkSafeUnref(fCurIntf);
174b442a6d5726569364e15c3056bbfb59b9b6e38cerobertphillips@google.com        SkSafeUnref(fCurRenderTarget);
175cf8fb1f6f03fc77f9927564f9ef9abeeeec508d2bsalomon@google.com#endif
176098e96df6ab0327f18537c7006ff2b0b4116ee30bsalomon@google.com    }
177098e96df6ab0327f18537c7006ff2b0b4116ee30bsalomon@google.com
1781195925b05ee9d666ea8a8f68fde5d8ca7e49b04bsalomon@google.com    virtual void setUpBackend(SampleWindow* win, int msaaSampleCount) {
179b442a6d5726569364e15c3056bbfb59b9b6e38cerobertphillips@google.com        SkASSERT(kNone_BackEndType == fBackend);
180b442a6d5726569364e15c3056bbfb59b9b6e38cerobertphillips@google.com
181b442a6d5726569364e15c3056bbfb59b9b6e38cerobertphillips@google.com        fBackend = kNone_BackEndType;
182d3b9fbbc48c13a1b2a664cf7e01374a44c201f51robertphillips@google.com
183cf8fb1f6f03fc77f9927564f9ef9abeeeec508d2bsalomon@google.com#if SK_SUPPORT_GPU
184b442a6d5726569364e15c3056bbfb59b9b6e38cerobertphillips@google.com        switch (win->getDeviceType()) {
185beedb81a7fa9bd1274d64b2c000ef6ee23c9a810reed            case kRaster_DeviceType:    // fallthrough
186beedb81a7fa9bd1274d64b2c000ef6ee23c9a810reed            case kPicture_DeviceType:    // fallthrough
187beedb81a7fa9bd1274d64b2c000ef6ee23c9a810reed            case kDeferred_DeviceType:    // fallthrough
188b442a6d5726569364e15c3056bbfb59b9b6e38cerobertphillips@google.com            case kGPU_DeviceType:
189b442a6d5726569364e15c3056bbfb59b9b6e38cerobertphillips@google.com                // all these guys use the native backend
190b442a6d5726569364e15c3056bbfb59b9b6e38cerobertphillips@google.com                fBackend = kNativeGL_BackEndType;
191b442a6d5726569364e15c3056bbfb59b9b6e38cerobertphillips@google.com                break;
192d3b9fbbc48c13a1b2a664cf7e01374a44c201f51robertphillips@google.com#if SK_ANGLE
193b442a6d5726569364e15c3056bbfb59b9b6e38cerobertphillips@google.com            case kANGLE_DeviceType:
194b442a6d5726569364e15c3056bbfb59b9b6e38cerobertphillips@google.com                // ANGLE is really the only odd man out
195b442a6d5726569364e15c3056bbfb59b9b6e38cerobertphillips@google.com                fBackend = kANGLE_BackEndType;
196b442a6d5726569364e15c3056bbfb59b9b6e38cerobertphillips@google.com                break;
197cf8fb1f6f03fc77f9927564f9ef9abeeeec508d2bsalomon@google.com#endif // SK_ANGLE
198b442a6d5726569364e15c3056bbfb59b9b6e38cerobertphillips@google.com            default:
199b442a6d5726569364e15c3056bbfb59b9b6e38cerobertphillips@google.com                SkASSERT(false);
200b442a6d5726569364e15c3056bbfb59b9b6e38cerobertphillips@google.com                break;
201d3b9fbbc48c13a1b2a664cf7e01374a44c201f51robertphillips@google.com        }
20264cc810ad165724f9c666a75bd52e41c67f13564bsalomon@google.com        AttachmentInfo attachmentInfo;
20364cc810ad165724f9c666a75bd52e41c67f13564bsalomon@google.com        bool result = win->attach(fBackend, msaaSampleCount, &attachmentInfo);
204d3b9fbbc48c13a1b2a664cf7e01374a44c201f51robertphillips@google.com        if (!result) {
20574913722bfe5e4b6810545891958e3d8e9c63791bsalomon@google.com            SkDebugf("Failed to initialize GL");
206b442a6d5726569364e15c3056bbfb59b9b6e38cerobertphillips@google.com            return;
207098e96df6ab0327f18537c7006ff2b0b4116ee30bsalomon@google.com        }
2081195925b05ee9d666ea8a8f68fde5d8ca7e49b04bsalomon@google.com        fMSAASampleCount = msaaSampleCount;
209b442a6d5726569364e15c3056bbfb59b9b6e38cerobertphillips@google.com
210b442a6d5726569364e15c3056bbfb59b9b6e38cerobertphillips@google.com        SkASSERT(NULL == fCurIntf);
211d8ed85101ee77ad2cb0c186a79d197698a75d246commit-bot@chromium.org        SkAutoTUnref<const GrGLInterface> glInterface;
212b442a6d5726569364e15c3056bbfb59b9b6e38cerobertphillips@google.com        switch (win->getDeviceType()) {
213beedb81a7fa9bd1274d64b2c000ef6ee23c9a810reed            case kRaster_DeviceType:    // fallthrough
214beedb81a7fa9bd1274d64b2c000ef6ee23c9a810reed            case kPicture_DeviceType:   // fallthrough
215beedb81a7fa9bd1274d64b2c000ef6ee23c9a810reed            case kDeferred_DeviceType:  // fallthrough
216b442a6d5726569364e15c3056bbfb59b9b6e38cerobertphillips@google.com            case kGPU_DeviceType:
217b442a6d5726569364e15c3056bbfb59b9b6e38cerobertphillips@google.com                // all these guys use the native interface
218d8ed85101ee77ad2cb0c186a79d197698a75d246commit-bot@chromium.org                glInterface.reset(GrGLCreateNativeInterface());
219b442a6d5726569364e15c3056bbfb59b9b6e38cerobertphillips@google.com                break;
220d3b9fbbc48c13a1b2a664cf7e01374a44c201f51robertphillips@google.com#if SK_ANGLE
221b442a6d5726569364e15c3056bbfb59b9b6e38cerobertphillips@google.com            case kANGLE_DeviceType:
222d8ed85101ee77ad2cb0c186a79d197698a75d246commit-bot@chromium.org                glInterface.reset(GrGLCreateANGLEInterface());
223b442a6d5726569364e15c3056bbfb59b9b6e38cerobertphillips@google.com                break;
224cf8fb1f6f03fc77f9927564f9ef9abeeeec508d2bsalomon@google.com#endif // SK_ANGLE
225b442a6d5726569364e15c3056bbfb59b9b6e38cerobertphillips@google.com            default:
226b442a6d5726569364e15c3056bbfb59b9b6e38cerobertphillips@google.com                SkASSERT(false);
227b442a6d5726569364e15c3056bbfb59b9b6e38cerobertphillips@google.com                break;
2286fb736fc2ea5f3f7ac44494211cc6755180ca192bsalomon@google.com        }
229b442a6d5726569364e15c3056bbfb59b9b6e38cerobertphillips@google.com
230d8ed85101ee77ad2cb0c186a79d197698a75d246commit-bot@chromium.org        // Currently SampleApp does not use NVPR. TODO: Provide an NVPR device type that is skipped
231d8ed85101ee77ad2cb0c186a79d197698a75d246commit-bot@chromium.org        // when the driver doesn't support NVPR.
232d8ed85101ee77ad2cb0c186a79d197698a75d246commit-bot@chromium.org        fCurIntf = GrGLInterfaceRemoveNVPR(glInterface.get());
233d8ed85101ee77ad2cb0c186a79d197698a75d246commit-bot@chromium.org
234b442a6d5726569364e15c3056bbfb59b9b6e38cerobertphillips@google.com        SkASSERT(NULL == fCurContext);
23516e3ddea6a80972aced04b21b1d66377fa95e7c7bsalomon@google.com        fCurContext = GrContext::Create(kOpenGL_GrBackend, (GrBackendContext) fCurIntf);
236b442a6d5726569364e15c3056bbfb59b9b6e38cerobertphillips@google.com
237b442a6d5726569364e15c3056bbfb59b9b6e38cerobertphillips@google.com        if (NULL == fCurContext || NULL == fCurIntf) {
238b442a6d5726569364e15c3056bbfb59b9b6e38cerobertphillips@google.com            // We need some context and interface to see results
239b442a6d5726569364e15c3056bbfb59b9b6e38cerobertphillips@google.com            SkSafeUnref(fCurContext);
240b442a6d5726569364e15c3056bbfb59b9b6e38cerobertphillips@google.com            SkSafeUnref(fCurIntf);
241d8ed85101ee77ad2cb0c186a79d197698a75d246commit-bot@chromium.org            fCurContext = NULL;
242d8ed85101ee77ad2cb0c186a79d197698a75d246commit-bot@chromium.org            fCurIntf = NULL;
243098e96df6ab0327f18537c7006ff2b0b4116ee30bsalomon@google.com            SkDebugf("Failed to setup 3D");
244b442a6d5726569364e15c3056bbfb59b9b6e38cerobertphillips@google.com
245b442a6d5726569364e15c3056bbfb59b9b6e38cerobertphillips@google.com            win->detach();
24674913722bfe5e4b6810545891958e3d8e9c63791bsalomon@google.com        }
247cf8fb1f6f03fc77f9927564f9ef9abeeeec508d2bsalomon@google.com#endif // SK_SUPPORT_GPU
248b442a6d5726569364e15c3056bbfb59b9b6e38cerobertphillips@google.com        // call windowSizeChanged to create the render target
249cf8fb1f6f03fc77f9927564f9ef9abeeeec508d2bsalomon@google.com        this->windowSizeChanged(win);
250098e96df6ab0327f18537c7006ff2b0b4116ee30bsalomon@google.com    }
251098e96df6ab0327f18537c7006ff2b0b4116ee30bsalomon@google.com
252b442a6d5726569364e15c3056bbfb59b9b6e38cerobertphillips@google.com    virtual void tearDownBackend(SampleWindow *win) {
253cf8fb1f6f03fc77f9927564f9ef9abeeeec508d2bsalomon@google.com#if SK_SUPPORT_GPU
254789e327ad9c9f7d25b2368b4f3f9812bf9f0a3a2reed        if (fCurContext) {
255789e327ad9c9f7d25b2368b4f3f9812bf9f0a3a2reed            // in case we have outstanding refs to this guy (lua?)
256789e327ad9c9f7d25b2368b4f3f9812bf9f0a3a2reed            fCurContext->abandonContext();
257789e327ad9c9f7d25b2368b4f3f9812bf9f0a3a2reed            fCurContext->unref();
258789e327ad9c9f7d25b2368b4f3f9812bf9f0a3a2reed            fCurContext = NULL;
259789e327ad9c9f7d25b2368b4f3f9812bf9f0a3a2reed        }
260b442a6d5726569364e15c3056bbfb59b9b6e38cerobertphillips@google.com
261b442a6d5726569364e15c3056bbfb59b9b6e38cerobertphillips@google.com        SkSafeUnref(fCurIntf);
262b442a6d5726569364e15c3056bbfb59b9b6e38cerobertphillips@google.com        fCurIntf = NULL;
263b442a6d5726569364e15c3056bbfb59b9b6e38cerobertphillips@google.com
264b442a6d5726569364e15c3056bbfb59b9b6e38cerobertphillips@google.com        SkSafeUnref(fCurRenderTarget);
265b442a6d5726569364e15c3056bbfb59b9b6e38cerobertphillips@google.com        fCurRenderTarget = NULL;
266cf8fb1f6f03fc77f9927564f9ef9abeeeec508d2bsalomon@google.com#endif
267ddd40e5e96c43ff6730745b53abf09bf0129f6d2bsalomon@google.com        win->detach();
268ddd40e5e96c43ff6730745b53abf09bf0129f6d2bsalomon@google.com        fBackend = kNone_BackEndType;
269098e96df6ab0327f18537c7006ff2b0b4116ee30bsalomon@google.com    }
270098e96df6ab0327f18537c7006ff2b0b4116ee30bsalomon@google.com
2710397e9f3415b4646797f1b17e9a38b5deb864ff0reed    virtual SkSurface* createSurface(SampleWindow::DeviceType dType,
27236352bf5e38f45a70ee4f4fc132a38048d38206dmtklein                                     SampleWindow* win) override {
273cf8fb1f6f03fc77f9927564f9ef9abeeeec508d2bsalomon@google.com#if SK_SUPPORT_GPU
27449f085dddff10473b6ebf832a974288300224e60bsalomon        if (IsGpuDeviceType(dType) && fCurContext) {
2754302ae91b0c97993f7b659474a5fd305921cdc5ereed            SkSurfaceProps props(win->getSurfaceProps());
2764302ae91b0c97993f7b659474a5fd305921cdc5ereed            return SkSurface::NewRenderTargetDirect(fCurRenderTarget, &props);
277098e96df6ab0327f18537c7006ff2b0b4116ee30bsalomon@google.com        }
2780397e9f3415b4646797f1b17e9a38b5deb864ff0reed#endif
2790397e9f3415b4646797f1b17e9a38b5deb864ff0reed        return NULL;
280098e96df6ab0327f18537c7006ff2b0b4116ee30bsalomon@google.com    }
281098e96df6ab0327f18537c7006ff2b0b4116ee30bsalomon@google.com
282098e96df6ab0327f18537c7006ff2b0b4116ee30bsalomon@google.com    virtual void publishCanvas(SampleWindow::DeviceType dType,
283098e96df6ab0327f18537c7006ff2b0b4116ee30bsalomon@google.com                               SkCanvas* canvas,
284098e96df6ab0327f18537c7006ff2b0b4116ee30bsalomon@google.com                               SampleWindow* win) {
285cf8fb1f6f03fc77f9927564f9ef9abeeeec508d2bsalomon@google.com#if SK_SUPPORT_GPU
286b442a6d5726569364e15c3056bbfb59b9b6e38cerobertphillips@google.com        if (fCurContext) {
287098e96df6ab0327f18537c7006ff2b0b4116ee30bsalomon@google.com            // in case we have queued drawing calls
288b442a6d5726569364e15c3056bbfb59b9b6e38cerobertphillips@google.com            fCurContext->flush();
289b442a6d5726569364e15c3056bbfb59b9b6e38cerobertphillips@google.com
29082502e2e3966a9b0e48665f20154eaacd2a452b3bsalomon@google.com            if (!IsGpuDeviceType(dType)) {
291098e96df6ab0327f18537c7006ff2b0b4116ee30bsalomon@google.com                // need to send the raster bits to the (gpu) window
292098e96df6ab0327f18537c7006ff2b0b4116ee30bsalomon@google.com                const SkBitmap& bm = win->getBitmap();
293b442a6d5726569364e15c3056bbfb59b9b6e38cerobertphillips@google.com                fCurRenderTarget->writePixels(0, 0, bm.width(), bm.height(),
294fb6fefed0976d7fed193155900a186dc880451b6commit-bot@chromium.org                                             SkImageInfo2GrPixelConfig(bm.colorType(),
295fa1e8a7cefd71f7b75f0b85f8eefe111814dd86fjvanverth                                                                       bm.alphaType(),
296fa1e8a7cefd71f7b75f0b85f8eefe111814dd86fjvanverth                                                                       bm.profileType()),
2976f3795105b2b458079e53a721c1735c9518f6bb5bsalomon@google.com                                             bm.getPixels(),
298f80bfedc42fde88ae3f8dbd7b21950a22258fd22bsalomon                                             bm.rowBytes(),
299f80bfedc42fde88ae3f8dbd7b21950a22258fd22bsalomon                                             GrContext::kFlushWrites_PixelOp);
300098e96df6ab0327f18537c7006ff2b0b4116ee30bsalomon@google.com            }
301098e96df6ab0327f18537c7006ff2b0b4116ee30bsalomon@google.com        }
302cf8fb1f6f03fc77f9927564f9ef9abeeeec508d2bsalomon@google.com#endif
303b442a6d5726569364e15c3056bbfb59b9b6e38cerobertphillips@google.com
304b442a6d5726569364e15c3056bbfb59b9b6e38cerobertphillips@google.com        win->present();
305098e96df6ab0327f18537c7006ff2b0b4116ee30bsalomon@google.com    }
306098e96df6ab0327f18537c7006ff2b0b4116ee30bsalomon@google.com
307098e96df6ab0327f18537c7006ff2b0b4116ee30bsalomon@google.com    virtual void windowSizeChanged(SampleWindow* win) {
308cf8fb1f6f03fc77f9927564f9ef9abeeeec508d2bsalomon@google.com#if SK_SUPPORT_GPU
309b442a6d5726569364e15c3056bbfb59b9b6e38cerobertphillips@google.com        if (fCurContext) {
31064cc810ad165724f9c666a75bd52e41c67f13564bsalomon@google.com            AttachmentInfo attachmentInfo;
31164cc810ad165724f9c666a75bd52e41c67f13564bsalomon@google.com            win->attach(fBackend, fMSAASampleCount, &attachmentInfo);
312b442a6d5726569364e15c3056bbfb59b9b6e38cerobertphillips@google.com            SkSafeUnref(fCurRenderTarget);
313c8fcafb3f0d152fb92465451bdb2e4bd3ef37222caryclark            fCurRenderTarget = win->renderTarget(attachmentInfo, fCurIntf, fCurContext);
31474913722bfe5e4b6810545891958e3d8e9c63791bsalomon@google.com        }
315cf8fb1f6f03fc77f9927564f9ef9abeeeec508d2bsalomon@google.com#endif
316098e96df6ab0327f18537c7006ff2b0b4116ee30bsalomon@google.com    }
317098e96df6ab0327f18537c7006ff2b0b4116ee30bsalomon@google.com
318b442a6d5726569364e15c3056bbfb59b9b6e38cerobertphillips@google.com    virtual GrContext* getGrContext() {
319cf8fb1f6f03fc77f9927564f9ef9abeeeec508d2bsalomon@google.com#if SK_SUPPORT_GPU
320b442a6d5726569364e15c3056bbfb59b9b6e38cerobertphillips@google.com        return fCurContext;
321cf8fb1f6f03fc77f9927564f9ef9abeeeec508d2bsalomon@google.com#else
322cf8fb1f6f03fc77f9927564f9ef9abeeeec508d2bsalomon@google.com        return NULL;
323cf8fb1f6f03fc77f9927564f9ef9abeeeec508d2bsalomon@google.com#endif
324098e96df6ab0327f18537c7006ff2b0b4116ee30bsalomon@google.com    }
3251195925b05ee9d666ea8a8f68fde5d8ca7e49b04bsalomon@google.com
32636352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    GrRenderTarget* getGrRenderTarget() override {
327cf8fb1f6f03fc77f9927564f9ef9abeeeec508d2bsalomon@google.com#if SK_SUPPORT_GPU
3281195925b05ee9d666ea8a8f68fde5d8ca7e49b04bsalomon@google.com        return fCurRenderTarget;
329cf8fb1f6f03fc77f9927564f9ef9abeeeec508d2bsalomon@google.com#else
330cf8fb1f6f03fc77f9927564f9ef9abeeeec508d2bsalomon@google.com        return NULL;
331cf8fb1f6f03fc77f9927564f9ef9abeeeec508d2bsalomon@google.com#endif
3321195925b05ee9d666ea8a8f68fde5d8ca7e49b04bsalomon@google.com    }
3331195925b05ee9d666ea8a8f68fde5d8ca7e49b04bsalomon@google.com
334098e96df6ab0327f18537c7006ff2b0b4116ee30bsalomon@google.comprivate:
335cf8fb1f6f03fc77f9927564f9ef9abeeeec508d2bsalomon@google.com
336cf8fb1f6f03fc77f9927564f9ef9abeeeec508d2bsalomon@google.com#if SK_SUPPORT_GPU
337b442a6d5726569364e15c3056bbfb59b9b6e38cerobertphillips@google.com    GrContext*              fCurContext;
338b442a6d5726569364e15c3056bbfb59b9b6e38cerobertphillips@google.com    const GrGLInterface*    fCurIntf;
339b442a6d5726569364e15c3056bbfb59b9b6e38cerobertphillips@google.com    GrRenderTarget*         fCurRenderTarget;
340cf8fb1f6f03fc77f9927564f9ef9abeeeec508d2bsalomon@google.com    int fMSAASampleCount;
341cf8fb1f6f03fc77f9927564f9ef9abeeeec508d2bsalomon@google.com#endif
342b442a6d5726569364e15c3056bbfb59b9b6e38cerobertphillips@google.com
343b442a6d5726569364e15c3056bbfb59b9b6e38cerobertphillips@google.com    SkOSWindow::SkBackEndTypes fBackend;
344b442a6d5726569364e15c3056bbfb59b9b6e38cerobertphillips@google.com
345b442a6d5726569364e15c3056bbfb59b9b6e38cerobertphillips@google.com    typedef SampleWindow::DeviceManager INHERITED;
346098e96df6ab0327f18537c7006ff2b0b4116ee30bsalomon@google.com};
347098e96df6ab0327f18537c7006ff2b0b4116ee30bsalomon@google.com
348098e96df6ab0327f18537c7006ff2b0b4116ee30bsalomon@google.com///////////////
3492eb595292b9624371d1698ae9da7accb4c09c26cmike@reedtribe.orgstatic const char view_inval_msg[] = "view-inval-msg";
3502eb595292b9624371d1698ae9da7accb4c09c26cmike@reedtribe.org
35162b65b0913566381db468277de07e5dd2a9237caScroggovoid SampleWindow::postInvalDelay() {
35287fac4abd7ea446c05d5cfd4a8ad27420223b591reed@google.com    (new SkEvent(view_inval_msg, this->getSinkID()))->postDelay(1);
3532eb595292b9624371d1698ae9da7accb4c09c26cmike@reedtribe.org}
3542eb595292b9624371d1698ae9da7accb4c09c26cmike@reedtribe.org
3552eb595292b9624371d1698ae9da7accb4c09c26cmike@reedtribe.orgstatic bool isInvalEvent(const SkEvent& evt) {
3562eb595292b9624371d1698ae9da7accb4c09c26cmike@reedtribe.org    return evt.isType(view_inval_msg);
3572eb595292b9624371d1698ae9da7accb4c09c26cmike@reedtribe.org}
3582eb595292b9624371d1698ae9da7accb4c09c26cmike@reedtribe.org//////////////////
3592eb595292b9624371d1698ae9da7accb4c09c26cmike@reedtribe.org
36048dd1a26ec07c5baa04856202e4e7e2a53e4d7e5bsalomon@google.comSkFuncViewFactory::SkFuncViewFactory(SkViewCreateFunc func)
36148dd1a26ec07c5baa04856202e4e7e2a53e4d7e5bsalomon@google.com    : fCreateFunc(func) {
36248dd1a26ec07c5baa04856202e4e7e2a53e4d7e5bsalomon@google.com}
36348dd1a26ec07c5baa04856202e4e7e2a53e4d7e5bsalomon@google.com
3648301de132eb016f56450017c0000f9b5d913809dbsalomon@google.comSkView* SkFuncViewFactory::operator() () const {
36548dd1a26ec07c5baa04856202e4e7e2a53e4d7e5bsalomon@google.com    return (*fCreateFunc)();
36648dd1a26ec07c5baa04856202e4e7e2a53e4d7e5bsalomon@google.com}
36748dd1a26ec07c5baa04856202e4e7e2a53e4d7e5bsalomon@google.com
36848dd1a26ec07c5baa04856202e4e7e2a53e4d7e5bsalomon@google.com#include "GMSampleView.h"
36948dd1a26ec07c5baa04856202e4e7e2a53e4d7e5bsalomon@google.com
37048dd1a26ec07c5baa04856202e4e7e2a53e4d7e5bsalomon@google.comSkGMSampleViewFactory::SkGMSampleViewFactory(GMFactoryFunc func)
37148dd1a26ec07c5baa04856202e4e7e2a53e4d7e5bsalomon@google.com    : fFunc(func) {
37248dd1a26ec07c5baa04856202e4e7e2a53e4d7e5bsalomon@google.com}
37348dd1a26ec07c5baa04856202e4e7e2a53e4d7e5bsalomon@google.com
37448dd1a26ec07c5baa04856202e4e7e2a53e4d7e5bsalomon@google.comSkView* SkGMSampleViewFactory::operator() () const {
375b21fac156d9287d6c0cfd446d707c4c7be6fae6ecommit-bot@chromium.org    skiagm::GM* gm = fFunc(NULL);
376b21fac156d9287d6c0cfd446d707c4c7be6fae6ecommit-bot@chromium.org    gm->setMode(skiagm::GM::kSample_Mode);
377b21fac156d9287d6c0cfd446d707c4c7be6fae6ecommit-bot@chromium.org    return new GMSampleView(gm);
37848dd1a26ec07c5baa04856202e4e7e2a53e4d7e5bsalomon@google.com}
37948dd1a26ec07c5baa04856202e4e7e2a53e4d7e5bsalomon@google.com
3808a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comSkViewRegister* SkViewRegister::gHead;
38148dd1a26ec07c5baa04856202e4e7e2a53e4d7e5bsalomon@google.comSkViewRegister::SkViewRegister(SkViewFactory* fact) : fFact(fact) {
38248dd1a26ec07c5baa04856202e4e7e2a53e4d7e5bsalomon@google.com    fFact->ref();
38348dd1a26ec07c5baa04856202e4e7e2a53e4d7e5bsalomon@google.com    fChain = gHead;
38448dd1a26ec07c5baa04856202e4e7e2a53e4d7e5bsalomon@google.com    gHead = this;
38548dd1a26ec07c5baa04856202e4e7e2a53e4d7e5bsalomon@google.com}
38648dd1a26ec07c5baa04856202e4e7e2a53e4d7e5bsalomon@google.com
38748dd1a26ec07c5baa04856202e4e7e2a53e4d7e5bsalomon@google.comSkViewRegister::SkViewRegister(SkViewCreateFunc func) {
38848dd1a26ec07c5baa04856202e4e7e2a53e4d7e5bsalomon@google.com    fFact = new SkFuncViewFactory(func);
38948dd1a26ec07c5baa04856202e4e7e2a53e4d7e5bsalomon@google.com    fChain = gHead;
39048dd1a26ec07c5baa04856202e4e7e2a53e4d7e5bsalomon@google.com    gHead = this;
39148dd1a26ec07c5baa04856202e4e7e2a53e4d7e5bsalomon@google.com}
39248dd1a26ec07c5baa04856202e4e7e2a53e4d7e5bsalomon@google.com
39348dd1a26ec07c5baa04856202e4e7e2a53e4d7e5bsalomon@google.comSkViewRegister::SkViewRegister(GMFactoryFunc func) {
39448dd1a26ec07c5baa04856202e4e7e2a53e4d7e5bsalomon@google.com    fFact = new SkGMSampleViewFactory(func);
39548dd1a26ec07c5baa04856202e4e7e2a53e4d7e5bsalomon@google.com    fChain = gHead;
39648dd1a26ec07c5baa04856202e4e7e2a53e4d7e5bsalomon@google.com    gHead = this;
39748dd1a26ec07c5baa04856202e4e7e2a53e4d7e5bsalomon@google.com}
39848dd1a26ec07c5baa04856202e4e7e2a53e4d7e5bsalomon@google.com
39948dd1a26ec07c5baa04856202e4e7e2a53e4d7e5bsalomon@google.comclass AutoUnrefArray {
40048dd1a26ec07c5baa04856202e4e7e2a53e4d7e5bsalomon@google.compublic:
40148dd1a26ec07c5baa04856202e4e7e2a53e4d7e5bsalomon@google.com    AutoUnrefArray() {}
40248dd1a26ec07c5baa04856202e4e7e2a53e4d7e5bsalomon@google.com    ~AutoUnrefArray() {
40348dd1a26ec07c5baa04856202e4e7e2a53e4d7e5bsalomon@google.com        int count = fObjs.count();
40448dd1a26ec07c5baa04856202e4e7e2a53e4d7e5bsalomon@google.com        for (int i = 0; i < count; ++i) {
40548dd1a26ec07c5baa04856202e4e7e2a53e4d7e5bsalomon@google.com            fObjs[i]->unref();
40648dd1a26ec07c5baa04856202e4e7e2a53e4d7e5bsalomon@google.com        }
40748dd1a26ec07c5baa04856202e4e7e2a53e4d7e5bsalomon@google.com    }
40848dd1a26ec07c5baa04856202e4e7e2a53e4d7e5bsalomon@google.com    SkRefCnt*& push_back() { return *fObjs.append(); }
4094605a3f3ff8fa2072f98e6bcb71bc43d4c6196d6chudy@google.com
41048dd1a26ec07c5baa04856202e4e7e2a53e4d7e5bsalomon@google.comprivate:
41148dd1a26ec07c5baa04856202e4e7e2a53e4d7e5bsalomon@google.com    SkTDArray<SkRefCnt*> fObjs;
41248dd1a26ec07c5baa04856202e4e7e2a53e4d7e5bsalomon@google.com};
41348dd1a26ec07c5baa04856202e4e7e2a53e4d7e5bsalomon@google.com
41448dd1a26ec07c5baa04856202e4e7e2a53e4d7e5bsalomon@google.com// registers GMs as Samples
41548dd1a26ec07c5baa04856202e4e7e2a53e4d7e5bsalomon@google.com// This can't be performed during static initialization because it could be
41648dd1a26ec07c5baa04856202e4e7e2a53e4d7e5bsalomon@google.com// run before GMRegistry has been fully built.
41702939ce4bddd3223d9e8cc98d4abd02939b7f70acaryclark@google.comstatic void SkGMRegistyToSampleRegistry() {
4188a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    static bool gOnce;
4194605a3f3ff8fa2072f98e6bcb71bc43d4c6196d6chudy@google.com    static AutoUnrefArray fRegisters;
42048dd1a26ec07c5baa04856202e4e7e2a53e4d7e5bsalomon@google.com
4218a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    if (!gOnce) {
42248dd1a26ec07c5baa04856202e4e7e2a53e4d7e5bsalomon@google.com        const skiagm::GMRegistry* gmreg = skiagm::GMRegistry::Head();
42348dd1a26ec07c5baa04856202e4e7e2a53e4d7e5bsalomon@google.com        while (gmreg) {
42448dd1a26ec07c5baa04856202e4e7e2a53e4d7e5bsalomon@google.com            fRegisters.push_back() = new SkViewRegister(gmreg->factory());
42548dd1a26ec07c5baa04856202e4e7e2a53e4d7e5bsalomon@google.com            gmreg = gmreg->next();
42648dd1a26ec07c5baa04856202e4e7e2a53e4d7e5bsalomon@google.com        }
4278a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        gOnce = true;
4288a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    }
4298a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
4308a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
431f0b5f68807cfa18cce0647d275778147901945cdreed@google.com//////////////////////////////////////////////////////////////////////////////
432f0b5f68807cfa18cce0647d275778147901945cdreed@google.com
433569e0435af62bdb88a662fa0592f75673a17afd9reed@google.comenum FlipAxisEnum {
434569e0435af62bdb88a662fa0592f75673a17afd9reed@google.com    kFlipAxis_X = (1 << 0),
435569e0435af62bdb88a662fa0592f75673a17afd9reed@google.com    kFlipAxis_Y = (1 << 1)
436569e0435af62bdb88a662fa0592f75673a17afd9reed@google.com};
437f0b5f68807cfa18cce0647d275778147901945cdreed@google.com
438569e0435af62bdb88a662fa0592f75673a17afd9reed@google.com#include "SkDrawFilter.h"
439569e0435af62bdb88a662fa0592f75673a17afd9reed@google.com
44096aabc850835f6d08a117c0277be93848ddbf785bungeman@google.comstruct HintingState {
44196aabc850835f6d08a117c0277be93848ddbf785bungeman@google.com    SkPaint::Hinting hinting;
44296aabc850835f6d08a117c0277be93848ddbf785bungeman@google.com    const char* name;
44396aabc850835f6d08a117c0277be93848ddbf785bungeman@google.com    const char* label;
44496aabc850835f6d08a117c0277be93848ddbf785bungeman@google.com};
44596aabc850835f6d08a117c0277be93848ddbf785bungeman@google.comstatic HintingState gHintingStates[] = {
44696aabc850835f6d08a117c0277be93848ddbf785bungeman@google.com    {SkPaint::kNo_Hinting, "Mixed", NULL },
44796aabc850835f6d08a117c0277be93848ddbf785bungeman@google.com    {SkPaint::kNo_Hinting, "None", "H0 " },
44896aabc850835f6d08a117c0277be93848ddbf785bungeman@google.com    {SkPaint::kSlight_Hinting, "Slight", "Hs " },
44996aabc850835f6d08a117c0277be93848ddbf785bungeman@google.com    {SkPaint::kNormal_Hinting, "Normal", "Hn " },
45096aabc850835f6d08a117c0277be93848ddbf785bungeman@google.com    {SkPaint::kFull_Hinting, "Full", "Hf " },
45196aabc850835f6d08a117c0277be93848ddbf785bungeman@google.com};
45296aabc850835f6d08a117c0277be93848ddbf785bungeman@google.com
45393a1215fe0ab007ce941c721f1fd3e9dcb5d4754reedstruct FilterQualityState {
45493a1215fe0ab007ce941c721f1fd3e9dcb5d4754reed    SkFilterQuality fQuality;
45593a1215fe0ab007ce941c721f1fd3e9dcb5d4754reed    const char*     fName;
45693a1215fe0ab007ce941c721f1fd3e9dcb5d4754reed    const char*     fLabel;
45715bc13d20fe79914c7128881e45064becd11bc9dreed@google.com};
45893a1215fe0ab007ce941c721f1fd3e9dcb5d4754reedstatic FilterQualityState gFilterQualityStates[] = {
45993a1215fe0ab007ce941c721f1fd3e9dcb5d4754reed    { kNone_SkFilterQuality,   "Mixed",    NULL    },
46093a1215fe0ab007ce941c721f1fd3e9dcb5d4754reed    { kNone_SkFilterQuality,   "None",     "F0 "   },
46193a1215fe0ab007ce941c721f1fd3e9dcb5d4754reed    { kLow_SkFilterQuality,    "Low",      "F1 "   },
46293a1215fe0ab007ce941c721f1fd3e9dcb5d4754reed    { kMedium_SkFilterQuality, "Medium",   "F2 "   },
46393a1215fe0ab007ce941c721f1fd3e9dcb5d4754reed    { kHigh_SkFilterQuality,   "High",     "F3 "   },
46415bc13d20fe79914c7128881e45064becd11bc9dreed@google.com};
46515bc13d20fe79914c7128881e45064becd11bc9dreed@google.com
466569e0435af62bdb88a662fa0592f75673a17afd9reed@google.comclass FlagsDrawFilter : public SkDrawFilter {
467569e0435af62bdb88a662fa0592f75673a17afd9reed@google.compublic:
46815bc13d20fe79914c7128881e45064becd11bc9dreed@google.com    FlagsDrawFilter(SkOSMenu::TriState lcd, SkOSMenu::TriState aa,
46993a1215fe0ab007ce941c721f1fd3e9dcb5d4754reed                    SkOSMenu::TriState subpixel, int hinting, int filterQuality)
47015bc13d20fe79914c7128881e45064becd11bc9dreed@google.com        : fLCDState(lcd)
47115bc13d20fe79914c7128881e45064becd11bc9dreed@google.com        , fAAState(aa)
47215bc13d20fe79914c7128881e45064becd11bc9dreed@google.com        , fSubpixelState(subpixel)
47315bc13d20fe79914c7128881e45064becd11bc9dreed@google.com        , fHintingState(hinting)
47493a1215fe0ab007ce941c721f1fd3e9dcb5d4754reed        , fFilterQualityIndex(filterQuality)
47515bc13d20fe79914c7128881e45064becd11bc9dreed@google.com    {
47693a1215fe0ab007ce941c721f1fd3e9dcb5d4754reed        SkASSERT((unsigned)filterQuality < SK_ARRAY_COUNT(gFilterQualityStates));
47715bc13d20fe79914c7128881e45064becd11bc9dreed@google.com    }
478f0b5f68807cfa18cce0647d275778147901945cdreed@google.com
479971aca75572ed6e0c5e1cc959173dc58ca7b6b8dreed@google.com    virtual bool filter(SkPaint* paint, Type t) {
480db03eaa37111a63835ab7f61cb550971e609a621yangsu@google.com        if (kText_Type == t && SkOSMenu::kMixedState != fLCDState) {
481db03eaa37111a63835ab7f61cb550971e609a621yangsu@google.com            paint->setLCDRenderText(SkOSMenu::kOnState == fLCDState);
482569e0435af62bdb88a662fa0592f75673a17afd9reed@google.com        }
483db03eaa37111a63835ab7f61cb550971e609a621yangsu@google.com        if (SkOSMenu::kMixedState != fAAState) {
484db03eaa37111a63835ab7f61cb550971e609a621yangsu@google.com            paint->setAntiAlias(SkOSMenu::kOnState == fAAState);
485f0b5f68807cfa18cce0647d275778147901945cdreed@google.com        }
48693a1215fe0ab007ce941c721f1fd3e9dcb5d4754reed        if (0 != fFilterQualityIndex) {
48793a1215fe0ab007ce941c721f1fd3e9dcb5d4754reed            paint->setFilterQuality(gFilterQualityStates[fFilterQualityIndex].fQuality);
488176753aa6d695ebcb76c0f82265ad69dc41dc593reed@google.com        }
48996aabc850835f6d08a117c0277be93848ddbf785bungeman@google.com        if (SkOSMenu::kMixedState != fSubpixelState) {
49096aabc850835f6d08a117c0277be93848ddbf785bungeman@google.com            paint->setSubpixelText(SkOSMenu::kOnState == fSubpixelState);
49196aabc850835f6d08a117c0277be93848ddbf785bungeman@google.com        }
492055aa52b2d450f41d0488bd50797d6e88d02852ebungeman@google.com        if (0 != fHintingState && fHintingState < (int)SK_ARRAY_COUNT(gHintingStates)) {
49396aabc850835f6d08a117c0277be93848ddbf785bungeman@google.com            paint->setHinting(gHintingStates[fHintingState].hinting);
49409e3baaaf54a8a3c701cfc5ad24a8180464a4742reed@google.com        }
495971aca75572ed6e0c5e1cc959173dc58ca7b6b8dreed@google.com        return true;
496f0b5f68807cfa18cce0647d275778147901945cdreed@google.com    }
497f0b5f68807cfa18cce0647d275778147901945cdreed@google.com
498f0b5f68807cfa18cce0647d275778147901945cdreed@google.comprivate:
499db03eaa37111a63835ab7f61cb550971e609a621yangsu@google.com    SkOSMenu::TriState  fLCDState;
500db03eaa37111a63835ab7f61cb550971e609a621yangsu@google.com    SkOSMenu::TriState  fAAState;
50196aabc850835f6d08a117c0277be93848ddbf785bungeman@google.com    SkOSMenu::TriState  fSubpixelState;
50296aabc850835f6d08a117c0277be93848ddbf785bungeman@google.com    int fHintingState;
50393a1215fe0ab007ce941c721f1fd3e9dcb5d4754reed    int fFilterQualityIndex;
504f0b5f68807cfa18cce0647d275778147901945cdreed@google.com};
505f0b5f68807cfa18cce0647d275778147901945cdreed@google.com
5068a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com//////////////////////////////////////////////////////////////////////////////
5078a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
508dd0cd34067d103ace7c6739405cb7885d8ad3fb2mike@reedtribe.org#define MAX_ZOOM_LEVEL  8
509dd0cd34067d103ace7c6739405cb7885d8ad3fb2mike@reedtribe.org#define MIN_ZOOM_LEVEL  -8
510dd0cd34067d103ace7c6739405cb7885d8ad3fb2mike@reedtribe.org
511f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.comstatic const char gCharEvtName[] = "SampleCode_Char_Event";
512f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.comstatic const char gKeyEvtName[] = "SampleCode_Key_Event";
5138a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comstatic const char gTitleEvtName[] = "SampleCode_Title_Event";
5148a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comstatic const char gPrefSizeEvtName[] = "SampleCode_PrefSize_Event";
515f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.comstatic const char gFastTextEvtName[] = "SampleCode_FastText_Event";
5162072db89016c4e53a648f4d4cec08b1d6be8558creed@google.comstatic const char gUpdateWindowTitleEvtName[] = "SampleCode_UpdateWindowTitle";
517f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com
518f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.combool SampleCode::CharQ(const SkEvent& evt, SkUnichar* outUni) {
519f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com    if (evt.isType(gCharEvtName, sizeof(gCharEvtName) - 1)) {
520f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com        if (outUni) {
521f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com            *outUni = evt.getFast32();
522f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com        }
523f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com        return true;
524f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com    }
525f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com    return false;
526f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com}
527f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com
528f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.combool SampleCode::KeyQ(const SkEvent& evt, SkKey* outKey) {
529f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com    if (evt.isType(gKeyEvtName, sizeof(gKeyEvtName) - 1)) {
530f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com        if (outKey) {
531f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com            *outKey = (SkKey)evt.getFast32();
532f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com        }
533f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com        return true;
534f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com    }
535f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com    return false;
536f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com}
5378a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
5388a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.combool SampleCode::TitleQ(const SkEvent& evt) {
5398a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    return evt.isType(gTitleEvtName, sizeof(gTitleEvtName) - 1);
5408a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
5418a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
5428a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comvoid SampleCode::TitleR(SkEvent* evt, const char title[]) {
5438a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkASSERT(evt && TitleQ(*evt));
5448a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    evt->setString(gTitleEvtName, title);
5458a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
5468a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
547db03eaa37111a63835ab7f61cb550971e609a621yangsu@google.combool SampleCode::RequestTitle(SkView* view, SkString* title) {
548db03eaa37111a63835ab7f61cb550971e609a621yangsu@google.com    SkEvent evt(gTitleEvtName);
549db03eaa37111a63835ab7f61cb550971e609a621yangsu@google.com    if (view->doQuery(&evt)) {
550db03eaa37111a63835ab7f61cb550971e609a621yangsu@google.com        title->set(evt.findString(gTitleEvtName));
551db03eaa37111a63835ab7f61cb550971e609a621yangsu@google.com        return true;
552db03eaa37111a63835ab7f61cb550971e609a621yangsu@google.com    }
553db03eaa37111a63835ab7f61cb550971e609a621yangsu@google.com    return false;
554db03eaa37111a63835ab7f61cb550971e609a621yangsu@google.com}
555db03eaa37111a63835ab7f61cb550971e609a621yangsu@google.com
5568a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.combool SampleCode::PrefSizeQ(const SkEvent& evt) {
5578a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    return evt.isType(gPrefSizeEvtName, sizeof(gPrefSizeEvtName) - 1);
5588a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
5598a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
5608a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comvoid SampleCode::PrefSizeR(SkEvent* evt, SkScalar width, SkScalar height) {
5618a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkASSERT(evt && PrefSizeQ(*evt));
5628a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkScalar size[2];
5638a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    size[0] = width;
5648a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    size[1] = height;
5658a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    evt->setScalars(gPrefSizeEvtName, 2, size);
5668a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
5678a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
568f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.combool SampleCode::FastTextQ(const SkEvent& evt) {
569f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com    return evt.isType(gFastTextEvtName, sizeof(gFastTextEvtName) - 1);
570f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com}
571f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com
572f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com///////////////////////////////////////////////////////////////////////////////
573f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com
574cc63b32eb8702bfa4d965fa443cf00fc1c1d10b7commit-bot@chromium.orgenum TilingMode {
575cc63b32eb8702bfa4d965fa443cf00fc1c1d10b7commit-bot@chromium.org    kNo_Tiling,
576cc63b32eb8702bfa4d965fa443cf00fc1c1d10b7commit-bot@chromium.org    kAbs_128x128_Tiling,
577cc63b32eb8702bfa4d965fa443cf00fc1c1d10b7commit-bot@chromium.org    kAbs_256x256_Tiling,
578cc63b32eb8702bfa4d965fa443cf00fc1c1d10b7commit-bot@chromium.org    kRel_4x4_Tiling,
579cc63b32eb8702bfa4d965fa443cf00fc1c1d10b7commit-bot@chromium.org    kRel_1x16_Tiling,
580cc63b32eb8702bfa4d965fa443cf00fc1c1d10b7commit-bot@chromium.org    kRel_16x1_Tiling,
581cc63b32eb8702bfa4d965fa443cf00fc1c1d10b7commit-bot@chromium.org
582cc63b32eb8702bfa4d965fa443cf00fc1c1d10b7commit-bot@chromium.org    kLast_TilingMode_Enum
583cc63b32eb8702bfa4d965fa443cf00fc1c1d10b7commit-bot@chromium.org};
584cc63b32eb8702bfa4d965fa443cf00fc1c1d10b7commit-bot@chromium.org
585cc63b32eb8702bfa4d965fa443cf00fc1c1d10b7commit-bot@chromium.orgstruct TilingInfo {
586cc63b32eb8702bfa4d965fa443cf00fc1c1d10b7commit-bot@chromium.org    const char* label;
587cc63b32eb8702bfa4d965fa443cf00fc1c1d10b7commit-bot@chromium.org    SkScalar    w, h;
588cc63b32eb8702bfa4d965fa443cf00fc1c1d10b7commit-bot@chromium.org};
589cc63b32eb8702bfa4d965fa443cf00fc1c1d10b7commit-bot@chromium.org
590bbe43a9ce0513d37cbd5dca583c391b7b1e39b3acommit-bot@chromium.orgstatic const struct TilingInfo gTilingInfo[] = {
591cc63b32eb8702bfa4d965fa443cf00fc1c1d10b7commit-bot@chromium.org    { "No tiling", SK_Scalar1        , SK_Scalar1         }, // kNo_Tiling
592cc63b32eb8702bfa4d965fa443cf00fc1c1d10b7commit-bot@chromium.org    { "128x128"  , SkIntToScalar(128), SkIntToScalar(128) }, // kAbs_128x128_Tiling
593cc63b32eb8702bfa4d965fa443cf00fc1c1d10b7commit-bot@chromium.org    { "256x256"  , SkIntToScalar(256), SkIntToScalar(256) }, // kAbs_256x256_Tiling
594cc63b32eb8702bfa4d965fa443cf00fc1c1d10b7commit-bot@chromium.org    { "1/4x1/4"  , SK_Scalar1 / 4    , SK_Scalar1 / 4     }, // kRel_4x4_Tiling
595cc63b32eb8702bfa4d965fa443cf00fc1c1d10b7commit-bot@chromium.org    { "1/1x1/16" , SK_Scalar1        , SK_Scalar1 / 16    }, // kRel_1x16_Tiling
596cc63b32eb8702bfa4d965fa443cf00fc1c1d10b7commit-bot@chromium.org    { "1/16x1/1" , SK_Scalar1 / 16   , SK_Scalar1         }, // kRel_16x1_Tiling
597cc63b32eb8702bfa4d965fa443cf00fc1c1d10b7commit-bot@chromium.org};
598cc63b32eb8702bfa4d965fa443cf00fc1c1d10b7commit-bot@chromium.orgSK_COMPILE_ASSERT((SK_ARRAY_COUNT(gTilingInfo) == kLast_TilingMode_Enum),
599cc63b32eb8702bfa4d965fa443cf00fc1c1d10b7commit-bot@chromium.org                  Incomplete_tiling_labels);
600cc63b32eb8702bfa4d965fa443cf00fc1c1d10b7commit-bot@chromium.org
601bbe43a9ce0513d37cbd5dca583c391b7b1e39b3acommit-bot@chromium.orgSkSize SampleWindow::tileSize() const {
602bbe43a9ce0513d37cbd5dca583c391b7b1e39b3acommit-bot@chromium.org    SkASSERT((TilingMode)fTilingMode < kLast_TilingMode_Enum);
603bbe43a9ce0513d37cbd5dca583c391b7b1e39b3acommit-bot@chromium.org    const struct TilingInfo* info = gTilingInfo + fTilingMode;
604bbe43a9ce0513d37cbd5dca583c391b7b1e39b3acommit-bot@chromium.org    return SkSize::Make(info->w > SK_Scalar1 ? info->w : this->width() * info->w,
605bbe43a9ce0513d37cbd5dca583c391b7b1e39b3acommit-bot@chromium.org                        info->h > SK_Scalar1 ? info->h : this->height() * info->h);
606bbe43a9ce0513d37cbd5dca583c391b7b1e39b3acommit-bot@chromium.org}
607cc63b32eb8702bfa4d965fa443cf00fc1c1d10b7commit-bot@chromium.org//////////////////////////////////////////////////////////////////////////////
608cc63b32eb8702bfa4d965fa443cf00fc1c1d10b7commit-bot@chromium.org
609f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.comstatic SkView* curr_view(SkWindow* wind) {
610f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com    SkView::F2BIter iter(wind);
611f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com    return iter.next();
612f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com}
613f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com
6146f6e8c39a7b07f8a916a60ad27f17bd13f3c89admike@reedtribe.orgstatic bool curr_title(SkWindow* wind, SkString* title) {
6156f6e8c39a7b07f8a916a60ad27f17bd13f3c89admike@reedtribe.org    SkView* view = curr_view(wind);
6166f6e8c39a7b07f8a916a60ad27f17bd13f3c89admike@reedtribe.org    if (view) {
6176f6e8c39a7b07f8a916a60ad27f17bd13f3c89admike@reedtribe.org        SkEvent evt(gTitleEvtName);
6186f6e8c39a7b07f8a916a60ad27f17bd13f3c89admike@reedtribe.org        if (view->doQuery(&evt)) {
6196f6e8c39a7b07f8a916a60ad27f17bd13f3c89admike@reedtribe.org            title->set(evt.findString(gTitleEvtName));
6206f6e8c39a7b07f8a916a60ad27f17bd13f3c89admike@reedtribe.org            return true;
6216f6e8c39a7b07f8a916a60ad27f17bd13f3c89admike@reedtribe.org        }
6226f6e8c39a7b07f8a916a60ad27f17bd13f3c89admike@reedtribe.org    }
6236f6e8c39a7b07f8a916a60ad27f17bd13f3c89admike@reedtribe.org    return false;
6246f6e8c39a7b07f8a916a60ad27f17bd13f3c89admike@reedtribe.org}
6256f6e8c39a7b07f8a916a60ad27f17bd13f3c89admike@reedtribe.org
626d9adfe6a223955bc69c8c7661ab8e0a078afbc32reedbool SampleWindow::sendAnimatePulse() {
627d9adfe6a223955bc69c8c7661ab8e0a078afbc32reed    SkView* view = curr_view(this);
628d9adfe6a223955bc69c8c7661ab8e0a078afbc32reed    if (SampleView::IsSampleView(view)) {
62976113a9b7716748c70ea0ecf7aacbabe4cce5009reed        return ((SampleView*)view)->animate(gAnimTimer);
630d9adfe6a223955bc69c8c7661ab8e0a078afbc32reed    }
631d9adfe6a223955bc69c8c7661ab8e0a078afbc32reed    return false;
632d9adfe6a223955bc69c8c7661ab8e0a078afbc32reed}
633d9adfe6a223955bc69c8c7661ab8e0a078afbc32reed
6342c8208f3a444098aee562f5a1ef620142807eda2Scroggovoid SampleWindow::setZoomCenter(float x, float y)
6352c8208f3a444098aee562f5a1ef620142807eda2Scroggo{
6364b413c8bb123e42ca4b9c7bfa6bc2167283cb84ccommit-bot@chromium.org    fZoomCenterX = x;
6374b413c8bb123e42ca4b9c7bfa6bc2167283cb84ccommit-bot@chromium.org    fZoomCenterY = y;
6382c8208f3a444098aee562f5a1ef620142807eda2Scroggo}
6398a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
6400f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggobool SampleWindow::zoomIn()
6410f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo{
6420f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo    // Arbitrarily decided
6430f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo    if (fFatBitsScale == 25) return false;
6440f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo    fFatBitsScale++;
6450f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo    this->inval(NULL);
6460f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo    return true;
6470f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo}
6480f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo
6490f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggobool SampleWindow::zoomOut()
6500f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo{
6510f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo    if (fFatBitsScale == 1) return false;
6520f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo    fFatBitsScale--;
6530f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo    this->inval(NULL);
6540f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo    return true;
6550f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo}
6560f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo
6570f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggovoid SampleWindow::updatePointer(int x, int y)
6580f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo{
6590f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo    fMouseX = x;
6600f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo    fMouseY = y;
6610f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo    if (fShowZoomer) {
6620f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo        this->inval(NULL);
6630f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo    }
6640f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo}
6650f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo
666098e96df6ab0327f18537c7006ff2b0b4116ee30bsalomon@google.comstatic inline SampleWindow::DeviceType cycle_devicetype(SampleWindow::DeviceType ct) {
667098e96df6ab0327f18537c7006ff2b0b4116ee30bsalomon@google.com    static const SampleWindow::DeviceType gCT[] = {
668098e96df6ab0327f18537c7006ff2b0b4116ee30bsalomon@google.com        SampleWindow::kPicture_DeviceType,
669cf8fb1f6f03fc77f9927564f9ef9abeeeec508d2bsalomon@google.com#if SK_SUPPORT_GPU
670098e96df6ab0327f18537c7006ff2b0b4116ee30bsalomon@google.com        SampleWindow::kGPU_DeviceType,
671b442a6d5726569364e15c3056bbfb59b9b6e38cerobertphillips@google.com#if SK_ANGLE
672b442a6d5726569364e15c3056bbfb59b9b6e38cerobertphillips@google.com        SampleWindow::kANGLE_DeviceType,
673cf8fb1f6f03fc77f9927564f9ef9abeeeec508d2bsalomon@google.com#endif // SK_ANGLE
674cf8fb1f6f03fc77f9927564f9ef9abeeeec508d2bsalomon@google.com#endif // SK_SUPPORT_GPU
675beedb81a7fa9bd1274d64b2c000ef6ee23c9a810reed        SampleWindow::kDeferred_DeviceType,
676beedb81a7fa9bd1274d64b2c000ef6ee23c9a810reed        SampleWindow::kRaster_DeviceType,
6778a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    };
678cf8fb1f6f03fc77f9927564f9ef9abeeeec508d2bsalomon@google.com    SK_COMPILE_ASSERT(SK_ARRAY_COUNT(gCT) == SampleWindow::kDeviceTypeCnt, array_size_mismatch);
6798a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    return gCT[ct];
6808a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
6818a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
682f8b6b01d51d08e39499d1c88063af2964fe72a0fedisonn@google.comstatic SkString getSampleTitle(const SkViewFactory* sampleFactory) {
683f8b6b01d51d08e39499d1c88063af2964fe72a0fedisonn@google.com    SkView* view = (*sampleFactory)();
684f8b6b01d51d08e39499d1c88063af2964fe72a0fedisonn@google.com    SkString title;
685f8b6b01d51d08e39499d1c88063af2964fe72a0fedisonn@google.com    SampleCode::RequestTitle(view, &title);
686f8b6b01d51d08e39499d1c88063af2964fe72a0fedisonn@google.com    view->unref();
687f8b6b01d51d08e39499d1c88063af2964fe72a0fedisonn@google.com    return title;
688f8b6b01d51d08e39499d1c88063af2964fe72a0fedisonn@google.com}
689f8b6b01d51d08e39499d1c88063af2964fe72a0fedisonn@google.com
690de36b6948116a3d498ad8d808869ba182a66e206edisonn@google.comstatic bool compareSampleTitle(const SkViewFactory* first, const SkViewFactory* second) {
691f8b6b01d51d08e39499d1c88063af2964fe72a0fedisonn@google.com    return strcmp(getSampleTitle(first).c_str(), getSampleTitle(second).c_str()) < 0;
6928570b5c8695052378491b0c61e745d736fe85c8drobertphillips@google.com}
6938570b5c8695052378491b0c61e745d736fe85c8drobertphillips@google.com
694fd117d8829407bb9903aafa436020d00ce762ec0mtkleinDEFINE_string(slide, "", "Start on this sample.");
695fd117d8829407bb9903aafa436020d00ce762ec0mtkleinDEFINE_int32(msaa, 0, "Request multisampling with this count.");
696fd117d8829407bb9903aafa436020d00ce762ec0mtkleinDEFINE_string(pictureDir, "", "Read pictures from here.");
697fd117d8829407bb9903aafa436020d00ce762ec0mtkleinDEFINE_string(picture, "", "Path to single picture.");
698fd117d8829407bb9903aafa436020d00ce762ec0mtkleinDEFINE_bool(sort, false, "Sort samples by title.");
699fd117d8829407bb9903aafa436020d00ce762ec0mtkleinDEFINE_bool(list, false, "List samples?");
700fd117d8829407bb9903aafa436020d00ce762ec0mtklein#ifdef SAMPLE_PDF_FILE_VIEWER
701fd117d8829407bb9903aafa436020d00ce762ec0mtkleinDEFINE_string(pdfPath, "", "Path to direcotry of pdf files.");
702fd117d8829407bb9903aafa436020d00ce762ec0mtklein#endif
703fd117d8829407bb9903aafa436020d00ce762ec0mtklein
70489889b69391a730f0ba2a1efb549864b7762263freed#include "SkTaskGroup.h"
70589889b69391a730f0ba2a1efb549864b7762263freed
7064605a3f3ff8fa2072f98e6bcb71bc43d4c6196d6chudy@google.comSampleWindow::SampleWindow(void* hwnd, int argc, char** argv, DeviceManager* devManager)
7074750fa55f27e43770e7f5f3161ebdbac42e0da8arobertphillips@google.com    : INHERITED(hwnd)
7084750fa55f27e43770e7f5f3161ebdbac42e0da8arobertphillips@google.com    , fDevManager(NULL) {
7098570b5c8695052378491b0c61e745d736fe85c8drobertphillips@google.com
710fd117d8829407bb9903aafa436020d00ce762ec0mtklein    SkCommandLineFlags::Parse(argc, argv);
711fd117d8829407bb9903aafa436020d00ce762ec0mtklein
7127d05ac9508bff5b1c62fec42dacb8aabd4cf8adbreed@google.com    fCurrIndex = -1;
7137d05ac9508bff5b1c62fec42dacb8aabd4cf8adbreed@google.com
714fd117d8829407bb9903aafa436020d00ce762ec0mtklein    if (!FLAGS_pictureDir.isEmpty()) {
715fd117d8829407bb9903aafa436020d00ce762ec0mtklein        SkOSFile::Iter iter(FLAGS_pictureDir[0], "skp");
716fd117d8829407bb9903aafa436020d00ce762ec0mtklein        SkString filename;
717fd117d8829407bb9903aafa436020d00ce762ec0mtklein        while (iter.next(&filename)) {
718fd117d8829407bb9903aafa436020d00ce762ec0mtklein            *fSamples.append() = new PictFileFactory(
719a8e2e1504b9af6ba791637f228debaa23953064atfarina                SkOSPath::Join(FLAGS_pictureDir[0], filename.c_str()));
720fd117d8829407bb9903aafa436020d00ce762ec0mtklein        }
721fd117d8829407bb9903aafa436020d00ce762ec0mtklein    }
722fd117d8829407bb9903aafa436020d00ce762ec0mtklein    if (!FLAGS_picture.isEmpty()) {
723fd117d8829407bb9903aafa436020d00ce762ec0mtklein        SkString path(FLAGS_picture[0]);
724fd117d8829407bb9903aafa436020d00ce762ec0mtklein        fCurrIndex = fSamples.count();
725fd117d8829407bb9903aafa436020d00ce762ec0mtklein        *fSamples.append() = new PictFileFactory(path);
726fd117d8829407bb9903aafa436020d00ce762ec0mtklein    }
727f8b6b01d51d08e39499d1c88063af2964fe72a0fedisonn@google.com#ifdef SAMPLE_PDF_FILE_VIEWER
728fd117d8829407bb9903aafa436020d00ce762ec0mtklein    if (!FLAGS_pdfPath.isEmpty()) {
729fd117d8829407bb9903aafa436020d00ce762ec0mtklein        SkOSFile::Iter iter(FLAGS_pdfPath[0], "pdf");
730fd117d8829407bb9903aafa436020d00ce762ec0mtklein        SkString filename;
731fd117d8829407bb9903aafa436020d00ce762ec0mtklein        while (iter.next(&filename)) {
732fd117d8829407bb9903aafa436020d00ce762ec0mtklein            *fSamples.append() = new PdfFileViewerFactory(
733a8e2e1504b9af6ba791637f228debaa23953064atfarina                SkOSPath::Join(FLAGS_pictureDir[0], filename.c_str()));
734fd117d8829407bb9903aafa436020d00ce762ec0mtklein        }
735fd117d8829407bb9903aafa436020d00ce762ec0mtklein    }
736fd117d8829407bb9903aafa436020d00ce762ec0mtklein#endif
73776d4021ee1bfbf31da274e9feb4c675cfd86e6d3robertphillips@google.com    SkGMRegistyToSampleRegistry();
73876d4021ee1bfbf31da274e9feb4c675cfd86e6d3robertphillips@google.com    {
73976d4021ee1bfbf31da274e9feb4c675cfd86e6d3robertphillips@google.com        const SkViewRegister* reg = SkViewRegister::Head();
74076d4021ee1bfbf31da274e9feb4c675cfd86e6d3robertphillips@google.com        while (reg) {
74176d4021ee1bfbf31da274e9feb4c675cfd86e6d3robertphillips@google.com            *fSamples.append() = reg->factory();
74276d4021ee1bfbf31da274e9feb4c675cfd86e6d3robertphillips@google.com            reg = reg->next();
74376d4021ee1bfbf31da274e9feb4c675cfd86e6d3robertphillips@google.com        }
74476d4021ee1bfbf31da274e9feb4c675cfd86e6d3robertphillips@google.com    }
74576d4021ee1bfbf31da274e9feb4c675cfd86e6d3robertphillips@google.com
746fd117d8829407bb9903aafa436020d00ce762ec0mtklein    if (FLAGS_sort) {
747f8b6b01d51d08e39499d1c88063af2964fe72a0fedisonn@google.com        // Sort samples, so foo.skp and foo.pdf are consecutive and we can quickly spot where
748f8b6b01d51d08e39499d1c88063af2964fe72a0fedisonn@google.com        // skp -> pdf -> png fails.
749f8b6b01d51d08e39499d1c88063af2964fe72a0fedisonn@google.com        SkTQSort(fSamples.begin(), fSamples.end() ? fSamples.end() - 1 : NULL, compareSampleTitle);
750f8b6b01d51d08e39499d1c88063af2964fe72a0fedisonn@google.com    }
751f8b6b01d51d08e39499d1c88063af2964fe72a0fedisonn@google.com
752fd117d8829407bb9903aafa436020d00ce762ec0mtklein    if (!FLAGS_slide.isEmpty()) {
753fd117d8829407bb9903aafa436020d00ce762ec0mtklein        fCurrIndex = findByTitle(FLAGS_slide[0]);
754fd117d8829407bb9903aafa436020d00ce762ec0mtklein        if (fCurrIndex < 0) {
755fd117d8829407bb9903aafa436020d00ce762ec0mtklein            fprintf(stderr, "Unknown sample \"%s\"\n", FLAGS_slide[0]);
7567265e725555098637498db2f397623d7991ceb4brobertphillips@google.com            listTitles();
7578570b5c8695052378491b0c61e745d736fe85c8drobertphillips@google.com        }
7588570b5c8695052378491b0c61e745d736fe85c8drobertphillips@google.com    }
7598570b5c8695052378491b0c61e745d736fe85c8drobertphillips@google.com
760fd117d8829407bb9903aafa436020d00ce762ec0mtklein    fMSAASampleCount = FLAGS_msaa;
761fd117d8829407bb9903aafa436020d00ce762ec0mtklein
762fd117d8829407bb9903aafa436020d00ce762ec0mtklein    if (FLAGS_list) {
763fd117d8829407bb9903aafa436020d00ce762ec0mtklein        listTitles();
764fd117d8829407bb9903aafa436020d00ce762ec0mtklein    }
765fd117d8829407bb9903aafa436020d00ce762ec0mtklein
7668570b5c8695052378491b0c61e745d736fe85c8drobertphillips@google.com    if (fCurrIndex < 0) {
7678570b5c8695052378491b0c61e745d736fe85c8drobertphillips@google.com        SkString title;
7688570b5c8695052378491b0c61e745d736fe85c8drobertphillips@google.com        if (readTitleFromPrefs(&title)) {
7698570b5c8695052378491b0c61e745d736fe85c8drobertphillips@google.com            fCurrIndex = findByTitle(title.c_str());
7708570b5c8695052378491b0c61e745d736fe85c8drobertphillips@google.com        }
7718570b5c8695052378491b0c61e745d736fe85c8drobertphillips@google.com    }
7728570b5c8695052378491b0c61e745d736fe85c8drobertphillips@google.com
7738570b5c8695052378491b0c61e745d736fe85c8drobertphillips@google.com    if (fCurrIndex < 0) {
7748570b5c8695052378491b0c61e745d736fe85c8drobertphillips@google.com        fCurrIndex = 0;
7758570b5c8695052378491b0c61e745d736fe85c8drobertphillips@google.com    }
7768570b5c8695052378491b0c61e745d736fe85c8drobertphillips@google.com
77789889b69391a730f0ba2a1efb549864b7762263freed    static SkTaskGroup::Enabler enabled(-1);
7783cec4d71e6f53fda99705427f9820d025cfbf64breed@google.com    gSampleWindow = this;
7793cec4d71e6f53fda99705427f9820d025cfbf64breed@google.com
7801f3942110a6fcec86eb411b49eab16d2bd91eb5byangsu@google.com#ifdef  PIPE_FILE
7811f3942110a6fcec86eb411b49eab16d2bd91eb5byangsu@google.com    //Clear existing file or create file if it doesn't exist
7821f3942110a6fcec86eb411b49eab16d2bd91eb5byangsu@google.com    FILE* f = fopen(FILE_PATH, "wb");
7831f3942110a6fcec86eb411b49eab16d2bd91eb5byangsu@google.com    fclose(f);
7841f3942110a6fcec86eb411b49eab16d2bd91eb5byangsu@google.com#endif
7854605a3f3ff8fa2072f98e6bcb71bc43d4c6196d6chudy@google.com
786bd8d7adb0ac9533a04e7b7a481371d4c66bbbc9brobertphillips@google.com    fDeviceType = kRaster_DeviceType;
787b442a6d5726569364e15c3056bbfb59b9b6e38cerobertphillips@google.com
788b442a6d5726569364e15c3056bbfb59b9b6e38cerobertphillips@google.com#if DEFAULT_TO_GPU
789b442a6d5726569364e15c3056bbfb59b9b6e38cerobertphillips@google.com    fDeviceType = kGPU_DeviceType;
790b442a6d5726569364e15c3056bbfb59b9b6e38cerobertphillips@google.com#endif
791b442a6d5726569364e15c3056bbfb59b9b6e38cerobertphillips@google.com#if SK_ANGLE && DEFAULT_TO_ANGLE
792b442a6d5726569364e15c3056bbfb59b9b6e38cerobertphillips@google.com    fDeviceType = kANGLE_DeviceType;
79353e96a14cac520c1fd071ad65d80b5bacc5c4e28robertphillips@google.com#endif
794b442a6d5726569364e15c3056bbfb59b9b6e38cerobertphillips@google.com
7958a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    fUseClip = false;
7968a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    fAnimating = false;
7976c5f6f25b43f1210decb48956c1a2fbe5b58f889reed@android.com    fRotate = false;
798e8f091093509d946a7f6722b40033a3dc946dc0fbsalomon@google.com    fPerspAnim = false;
799f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com    fRequestGrabImage = false;
800b073d920c90bc95f6c216327acd321a4fc809bfascroggo@google.com    fPipeState = SkOSMenu::kOffState;
801cc63b32eb8702bfa4d965fa443cf00fc1c1d10b7commit-bot@chromium.org    fTilingMode = kNo_Tiling;
8022eb595292b9624371d1698ae9da7accb4c09c26cmike@reedtribe.org    fMeasureFPS = false;
803db03eaa37111a63835ab7f61cb550971e609a621yangsu@google.com    fLCDState = SkOSMenu::kMixedState;
804db03eaa37111a63835ab7f61cb550971e609a621yangsu@google.com    fAAState = SkOSMenu::kMixedState;
80596aabc850835f6d08a117c0277be93848ddbf785bungeman@google.com    fSubpixelState = SkOSMenu::kMixedState;
80696aabc850835f6d08a117c0277be93848ddbf785bungeman@google.com    fHintingState = 0;
80793a1215fe0ab007ce941c721f1fd3e9dcb5d4754reed    fFilterQualityIndex = 0;
808569e0435af62bdb88a662fa0592f75673a17afd9reed@google.com    fFlipAxis = 0;
8098a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    fScrollTestX = fScrollTestY = 0;
8108a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
8110f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo    fMouseX = fMouseY = 0;
8123ce59dc4999de5d6c6913af662c8b0b8020a4ef7mike@reedtribe.org    fFatBitsScale = 8;
8130f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo    fTypeface = SkTypeface::CreateFromTypeface(NULL, SkTypeface::kBold);
8140f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo    fShowZoomer = false;
8154605a3f3ff8fa2072f98e6bcb71bc43d4c6196d6chudy@google.com
816dd0cd34067d103ace7c6739405cb7885d8ad3fb2mike@reedtribe.org    fZoomLevel = 0;
817dd0cd34067d103ace7c6739405cb7885d8ad3fb2mike@reedtribe.org    fZoomScale = SK_Scalar1;
8184605a3f3ff8fa2072f98e6bcb71bc43d4c6196d6chudy@google.com
819db03eaa37111a63835ab7f61cb550971e609a621yangsu@google.com    fMagnify = false;
8204605a3f3ff8fa2072f98e6bcb71bc43d4c6196d6chudy@google.com
8218ac0d542b0226e68b0faa935b3402ffc91409a02Scroggo    fSaveToPdf = false;
8228ac0d542b0226e68b0faa935b3402ffc91409a02Scroggo
823db03eaa37111a63835ab7f61cb550971e609a621yangsu@google.com    fTransitionNext = 6;
824db03eaa37111a63835ab7f61cb550971e609a621yangsu@google.com    fTransitionPrev = 2;
8254605a3f3ff8fa2072f98e6bcb71bc43d4c6196d6chudy@google.com
826921091f29e2ecfec55f4d1ac5611b4aa4731e7d6yangsu@google.com    int sinkID = this->getSinkID();
8277dadc748d96fdf6c1eadc960f1481807d2ac90cfscroggo@google.com    fAppMenu = new SkOSMenu;
8287dadc748d96fdf6c1eadc960f1481807d2ac90cfscroggo@google.com    fAppMenu->setTitle("Global Settings");
829db03eaa37111a63835ab7f61cb550971e609a621yangsu@google.com    int itemID;
8304605a3f3ff8fa2072f98e6bcb71bc43d4c6196d6chudy@google.com
8314605a3f3ff8fa2072f98e6bcb71bc43d4c6196d6chudy@google.com    itemID =fAppMenu->appendList("Device Type", "Device Type", sinkID, 0,
832beedb81a7fa9bd1274d64b2c000ef6ee23c9a810reed                                "Raster", "Picture", "OpenGL", "Deferred",
833b442a6d5726569364e15c3056bbfb59b9b6e38cerobertphillips@google.com#if SK_ANGLE
834b442a6d5726569364e15c3056bbfb59b9b6e38cerobertphillips@google.com                                "ANGLE",
835b442a6d5726569364e15c3056bbfb59b9b6e38cerobertphillips@google.com#endif
836b442a6d5726569364e15c3056bbfb59b9b6e38cerobertphillips@google.com                                NULL);
8377dadc748d96fdf6c1eadc960f1481807d2ac90cfscroggo@google.com    fAppMenu->assignKeyEquivalentToItem(itemID, 'd');
8387dadc748d96fdf6c1eadc960f1481807d2ac90cfscroggo@google.com    itemID = fAppMenu->appendTriState("AA", "AA", sinkID, fAAState);
8397dadc748d96fdf6c1eadc960f1481807d2ac90cfscroggo@google.com    fAppMenu->assignKeyEquivalentToItem(itemID, 'b');
8407dadc748d96fdf6c1eadc960f1481807d2ac90cfscroggo@google.com    itemID = fAppMenu->appendTriState("LCD", "LCD", sinkID, fLCDState);
8417dadc748d96fdf6c1eadc960f1481807d2ac90cfscroggo@google.com    fAppMenu->assignKeyEquivalentToItem(itemID, 'l');
84293a1215fe0ab007ce941c721f1fd3e9dcb5d4754reed    itemID = fAppMenu->appendList("FilterQuality", "FilterQuality", sinkID, fFilterQualityIndex,
84393a1215fe0ab007ce941c721f1fd3e9dcb5d4754reed                                  gFilterQualityStates[0].fName,
84493a1215fe0ab007ce941c721f1fd3e9dcb5d4754reed                                  gFilterQualityStates[1].fName,
84593a1215fe0ab007ce941c721f1fd3e9dcb5d4754reed                                  gFilterQualityStates[2].fName,
84693a1215fe0ab007ce941c721f1fd3e9dcb5d4754reed                                  gFilterQualityStates[3].fName,
84793a1215fe0ab007ce941c721f1fd3e9dcb5d4754reed                                  gFilterQualityStates[4].fName,
84815bc13d20fe79914c7128881e45064becd11bc9dreed@google.com                                  NULL);
8497dadc748d96fdf6c1eadc960f1481807d2ac90cfscroggo@google.com    fAppMenu->assignKeyEquivalentToItem(itemID, 'n');
85096aabc850835f6d08a117c0277be93848ddbf785bungeman@google.com    itemID = fAppMenu->appendTriState("Subpixel", "Subpixel", sinkID, fSubpixelState);
85196aabc850835f6d08a117c0277be93848ddbf785bungeman@google.com    fAppMenu->assignKeyEquivalentToItem(itemID, 's');
85296aabc850835f6d08a117c0277be93848ddbf785bungeman@google.com    itemID = fAppMenu->appendList("Hinting", "Hinting", sinkID, fHintingState,
85396aabc850835f6d08a117c0277be93848ddbf785bungeman@google.com                                  gHintingStates[0].name,
85496aabc850835f6d08a117c0277be93848ddbf785bungeman@google.com                                  gHintingStates[1].name,
85596aabc850835f6d08a117c0277be93848ddbf785bungeman@google.com                                  gHintingStates[2].name,
85696aabc850835f6d08a117c0277be93848ddbf785bungeman@google.com                                  gHintingStates[3].name,
857a9133bbcc6deceb5cd883305767093e10c17c359bungeman@google.com                                  gHintingStates[4].name,
858a9133bbcc6deceb5cd883305767093e10c17c359bungeman@google.com                                  NULL);
8597dadc748d96fdf6c1eadc960f1481807d2ac90cfscroggo@google.com    fAppMenu->assignKeyEquivalentToItem(itemID, 'h');
86067b89eeeb07aa0485db233b5f356031fe15b57c4reed@google.com
861b073d920c90bc95f6c216327acd321a4fc809bfascroggo@google.com    fUsePipeMenuItemID = fAppMenu->appendTriState("Pipe", "Pipe" , sinkID,
8624605a3f3ff8fa2072f98e6bcb71bc43d4c6196d6chudy@google.com                                                  fPipeState);
863b073d920c90bc95f6c216327acd321a4fc809bfascroggo@google.com    fAppMenu->assignKeyEquivalentToItem(fUsePipeMenuItemID, 'P');
86467b89eeeb07aa0485db233b5f356031fe15b57c4reed@google.com
865cc63b32eb8702bfa4d965fa443cf00fc1c1d10b7commit-bot@chromium.org    itemID =fAppMenu->appendList("Tiling", "Tiling", sinkID, fTilingMode,
866cc63b32eb8702bfa4d965fa443cf00fc1c1d10b7commit-bot@chromium.org                                 gTilingInfo[kNo_Tiling].label,
867cc63b32eb8702bfa4d965fa443cf00fc1c1d10b7commit-bot@chromium.org                                 gTilingInfo[kAbs_128x128_Tiling].label,
868cc63b32eb8702bfa4d965fa443cf00fc1c1d10b7commit-bot@chromium.org                                 gTilingInfo[kAbs_256x256_Tiling].label,
869cc63b32eb8702bfa4d965fa443cf00fc1c1d10b7commit-bot@chromium.org                                 gTilingInfo[kRel_4x4_Tiling].label,
870cc63b32eb8702bfa4d965fa443cf00fc1c1d10b7commit-bot@chromium.org                                 gTilingInfo[kRel_1x16_Tiling].label,
871cc63b32eb8702bfa4d965fa443cf00fc1c1d10b7commit-bot@chromium.org                                 gTilingInfo[kRel_16x1_Tiling].label,
872cc63b32eb8702bfa4d965fa443cf00fc1c1d10b7commit-bot@chromium.org                                 NULL);
87367b89eeeb07aa0485db233b5f356031fe15b57c4reed@google.com    fAppMenu->assignKeyEquivalentToItem(itemID, 't');
87467b89eeeb07aa0485db233b5f356031fe15b57c4reed@google.com
8754605a3f3ff8fa2072f98e6bcb71bc43d4c6196d6chudy@google.com    itemID = fAppMenu->appendSwitch("Slide Show", "Slide Show" , sinkID, false);
8764605a3f3ff8fa2072f98e6bcb71bc43d4c6196d6chudy@google.com    fAppMenu->assignKeyEquivalentToItem(itemID, 'a');
8774605a3f3ff8fa2072f98e6bcb71bc43d4c6196d6chudy@google.com    itemID = fAppMenu->appendSwitch("Clip", "Clip" , sinkID, fUseClip);
8787dadc748d96fdf6c1eadc960f1481807d2ac90cfscroggo@google.com    fAppMenu->assignKeyEquivalentToItem(itemID, 'c');
8794605a3f3ff8fa2072f98e6bcb71bc43d4c6196d6chudy@google.com    itemID = fAppMenu->appendSwitch("Flip X", "Flip X" , sinkID, false);
8807dadc748d96fdf6c1eadc960f1481807d2ac90cfscroggo@google.com    fAppMenu->assignKeyEquivalentToItem(itemID, 'x');
8817dadc748d96fdf6c1eadc960f1481807d2ac90cfscroggo@google.com    itemID = fAppMenu->appendSwitch("Flip Y", "Flip Y" , sinkID, false);
8827dadc748d96fdf6c1eadc960f1481807d2ac90cfscroggo@google.com    fAppMenu->assignKeyEquivalentToItem(itemID, 'y');
8837dadc748d96fdf6c1eadc960f1481807d2ac90cfscroggo@google.com    itemID = fAppMenu->appendSwitch("Zoomer", "Zoomer" , sinkID, fShowZoomer);
8847dadc748d96fdf6c1eadc960f1481807d2ac90cfscroggo@google.com    fAppMenu->assignKeyEquivalentToItem(itemID, 'z');
8857dadc748d96fdf6c1eadc960f1481807d2ac90cfscroggo@google.com    itemID = fAppMenu->appendSwitch("Magnify", "Magnify" , sinkID, fMagnify);
8867dadc748d96fdf6c1eadc960f1481807d2ac90cfscroggo@google.com    fAppMenu->assignKeyEquivalentToItem(itemID, 'm');
8874605a3f3ff8fa2072f98e6bcb71bc43d4c6196d6chudy@google.com    itemID =fAppMenu->appendList("Transition-Next", "Transition-Next", sinkID,
8884605a3f3ff8fa2072f98e6bcb71bc43d4c6196d6chudy@google.com                                fTransitionNext, "Up", "Up and Right", "Right",
8894605a3f3ff8fa2072f98e6bcb71bc43d4c6196d6chudy@google.com                                "Down and Right", "Down", "Down and Left",
890db03eaa37111a63835ab7f61cb550971e609a621yangsu@google.com                                "Left", "Up and Left", NULL);
8917dadc748d96fdf6c1eadc960f1481807d2ac90cfscroggo@google.com    fAppMenu->assignKeyEquivalentToItem(itemID, 'j');
8924605a3f3ff8fa2072f98e6bcb71bc43d4c6196d6chudy@google.com    itemID =fAppMenu->appendList("Transition-Prev", "Transition-Prev", sinkID,
8934605a3f3ff8fa2072f98e6bcb71bc43d4c6196d6chudy@google.com                                fTransitionPrev, "Up", "Up and Right", "Right",
8944605a3f3ff8fa2072f98e6bcb71bc43d4c6196d6chudy@google.com                                "Down and Right", "Down", "Down and Left",
895db03eaa37111a63835ab7f61cb550971e609a621yangsu@google.com                                "Left", "Up and Left", NULL);
8967dadc748d96fdf6c1eadc960f1481807d2ac90cfscroggo@google.com    fAppMenu->assignKeyEquivalentToItem(itemID, 'k');
8977dadc748d96fdf6c1eadc960f1481807d2ac90cfscroggo@google.com    itemID = fAppMenu->appendAction("Save to PDF", sinkID);
8987dadc748d96fdf6c1eadc960f1481807d2ac90cfscroggo@google.com    fAppMenu->assignKeyEquivalentToItem(itemID, 'e');
8994605a3f3ff8fa2072f98e6bcb71bc43d4c6196d6chudy@google.com
9007dadc748d96fdf6c1eadc960f1481807d2ac90cfscroggo@google.com    this->addMenu(fAppMenu);
9017dadc748d96fdf6c1eadc960f1481807d2ac90cfscroggo@google.com    fSlideMenu = new SkOSMenu;
9027dadc748d96fdf6c1eadc960f1481807d2ac90cfscroggo@google.com    this->addMenu(fSlideMenu);
9034605a3f3ff8fa2072f98e6bcb71bc43d4c6196d6chudy@google.com
9042fbc7fa460c99bffa78b9afb9aaa4dc0db68e1babsalomon@google.com    this->setVisibleP(true);
905f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com    this->setClipToBounds(false);
9068a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
90748dd1a26ec07c5baa04856202e4e7e2a53e4d7e5bsalomon@google.com    this->loadView((*fSamples[fCurrIndex])());
9084605a3f3ff8fa2072f98e6bcb71bc43d4c6196d6chudy@google.com
909098e96df6ab0327f18537c7006ff2b0b4116ee30bsalomon@google.com    if (NULL == devManager) {
910098e96df6ab0327f18537c7006ff2b0b4116ee30bsalomon@google.com        fDevManager = new DefaultDeviceManager();
911098e96df6ab0327f18537c7006ff2b0b4116ee30bsalomon@google.com    } else {
912098e96df6ab0327f18537c7006ff2b0b4116ee30bsalomon@google.com        devManager->ref();
913098e96df6ab0327f18537c7006ff2b0b4116ee30bsalomon@google.com        fDevManager = devManager;
914098e96df6ab0327f18537c7006ff2b0b4116ee30bsalomon@google.com    }
9151195925b05ee9d666ea8a8f68fde5d8ca7e49b04bsalomon@google.com    fDevManager->setUpBackend(this, fMSAASampleCount);
916098e96df6ab0327f18537c7006ff2b0b4116ee30bsalomon@google.com
917b4490c7435df46261c00dbfdcdd9d2e9d56d1f52Scroggo    // If another constructor set our dimensions, ensure that our
918b4490c7435df46261c00dbfdcdd9d2e9d56d1f52Scroggo    // onSizeChange gets called.
919b4490c7435df46261c00dbfdcdd9d2e9d56d1f52Scroggo    if (this->height() && this->width()) {
920b4490c7435df46261c00dbfdcdd9d2e9d56d1f52Scroggo        this->onSizeChange();
921b4490c7435df46261c00dbfdcdd9d2e9d56d1f52Scroggo    }
9222072db89016c4e53a648f4d4cec08b1d6be8558creed@google.com
9232072db89016c4e53a648f4d4cec08b1d6be8558creed@google.com    // can't call this synchronously, since it may require a subclass to
9242072db89016c4e53a648f4d4cec08b1d6be8558creed@google.com    // to implement, or the caller may need us to have returned from the
9252072db89016c4e53a648f4d4cec08b1d6be8558creed@google.com    // constructor first. Hence we post an event to ourselves.
9262072db89016c4e53a648f4d4cec08b1d6be8558creed@google.com//    this->updateTitle();
9276de4a7836f1c7988b42cbbfe1a339ef7619aed8fcommit-bot@chromium.org    post_event_to_sink(new SkEvent(gUpdateWindowTitleEvtName), this);
92876113a9b7716748c70ea0ecf7aacbabe4cce5009reed
92976113a9b7716748c70ea0ecf7aacbabe4cce5009reed    gAnimTimer.run();
9308a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
9318a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
9328a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comSampleWindow::~SampleWindow() {
933b17c764f852c04d84f8fbbc3c82eefb8c7665217Ben Wagner    SkSafeUnref(fTypeface);
934098e96df6ab0327f18537c7006ff2b0b4116ee30bsalomon@google.com    SkSafeUnref(fDevManager);
9358a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
9368a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
937f8b6b01d51d08e39499d1c88063af2964fe72a0fedisonn@google.com
9386f6e8c39a7b07f8a916a60ad27f17bd13f3c89admike@reedtribe.orgint SampleWindow::findByTitle(const char title[]) {
9396f6e8c39a7b07f8a916a60ad27f17bd13f3c89admike@reedtribe.org    int i, count = fSamples.count();
9406f6e8c39a7b07f8a916a60ad27f17bd13f3c89admike@reedtribe.org    for (i = 0; i < count; i++) {
9416f6e8c39a7b07f8a916a60ad27f17bd13f3c89admike@reedtribe.org        if (getSampleTitle(i).equals(title)) {
9426f6e8c39a7b07f8a916a60ad27f17bd13f3c89admike@reedtribe.org            return i;
9436f6e8c39a7b07f8a916a60ad27f17bd13f3c89admike@reedtribe.org        }
9446f6e8c39a7b07f8a916a60ad27f17bd13f3c89admike@reedtribe.org    }
945dd52caaa093845c7c5157be78d94feb72f9cb155mike@reedtribe.org    return -1;
9466f6e8c39a7b07f8a916a60ad27f17bd13f3c89admike@reedtribe.org}
9476f6e8c39a7b07f8a916a60ad27f17bd13f3c89admike@reedtribe.org
9487265e725555098637498db2f397623d7991ceb4brobertphillips@google.comvoid SampleWindow::listTitles() {
9497265e725555098637498db2f397623d7991ceb4brobertphillips@google.com    int count = fSamples.count();
9507265e725555098637498db2f397623d7991ceb4brobertphillips@google.com    SkDebugf("All Slides:\n");
9517265e725555098637498db2f397623d7991ceb4brobertphillips@google.com    for (int i = 0; i < count; i++) {
9527265e725555098637498db2f397623d7991ceb4brobertphillips@google.com        SkDebugf("    %s\n", getSampleTitle(i).c_str());
9537265e725555098637498db2f397623d7991ceb4brobertphillips@google.com    }
9547265e725555098637498db2f397623d7991ceb4brobertphillips@google.com}
9557265e725555098637498db2f397623d7991ceb4brobertphillips@google.com
95655e76b209c9249308a9ba3d75c2472dd55e9d298reed@android.comstatic SkBitmap capture_bitmap(SkCanvas* canvas) {
95755e76b209c9249308a9ba3d75c2472dd55e9d298reed@android.com    SkBitmap bm;
958848250415eddc54075f7eb8795e8db79e749c6abreed    if (bm.tryAllocPixels(canvas->imageInfo())) {
959c3bd8af6d5722e854feca70c40d92f4954c5b67bcommit-bot@chromium.org        canvas->readPixels(&bm, 0, 0);
960c3bd8af6d5722e854feca70c40d92f4954c5b67bcommit-bot@chromium.org    }
96155e76b209c9249308a9ba3d75c2472dd55e9d298reed@android.com    return bm;
96255e76b209c9249308a9ba3d75c2472dd55e9d298reed@android.com}
96355e76b209c9249308a9ba3d75c2472dd55e9d298reed@android.com
964f7f79d2a6e669058ee9bb9fc4f0a9e998bfc5da6reedstatic void drawText(SkCanvas* canvas, SkString str, SkScalar left, SkScalar top, SkPaint& paint) {
9650f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo    SkColor desiredColor = paint.getColor();
9660f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo    paint.setColor(SK_ColorWHITE);
967f7f79d2a6e669058ee9bb9fc4f0a9e998bfc5da6reed    const char* c_str = str.c_str();
968f7f79d2a6e669058ee9bb9fc4f0a9e998bfc5da6reed    size_t size = str.size();
9690f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo    SkRect bounds;
9700f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo    paint.measureText(c_str, size, &bounds);
9710f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo    bounds.offset(left, top);
9720f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo    SkScalar inset = SkIntToScalar(-2);
9730f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo    bounds.inset(inset, inset);
9740f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo    canvas->drawRect(bounds, paint);
9750f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo    if (desiredColor != SK_ColorBLACK) {
9760f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo        paint.setColor(SK_ColorBLACK);
9770f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo        canvas->drawText(c_str, size, left + SK_Scalar1, top + SK_Scalar1, paint);
9780f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo    }
9790f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo    paint.setColor(desiredColor);
9800f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo    canvas->drawText(c_str, size, left, top, paint);
9810f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo}
9820f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo
9834417740a480786ca65379ba5b398c500ba34ee18reed@android.com#define XCLIP_N  8
9844417740a480786ca65379ba5b398c500ba34ee18reed@android.com#define YCLIP_N  8
985e522ca5d5f249bd51a00cb68bb051f811d0a9e85reed@android.com
986e522ca5d5f249bd51a00cb68bb051f811d0a9e85reed@android.comvoid SampleWindow::draw(SkCanvas* canvas) {
98776113a9b7716748c70ea0ecf7aacbabe4cce5009reed    gAnimTimer.updateTime();
9884605a3f3ff8fa2072f98e6bcb71bc43d4c6196d6chudy@google.com
989f03bb566e25ace918f8fdda3cb8426626a00894creed@google.com    if (fGesture.isActive()) {
990f03bb566e25ace918f8fdda3cb8426626a00894creed@google.com        this->updateMatrix();
99152f57e1d11a00bdc5efb96709446546cdbc1ff9dreed@google.com    }
9924605a3f3ff8fa2072f98e6bcb71bc43d4c6196d6chudy@google.com
993796763e0b2c06a7789185322561a1135e5484688djsollen@google.com    if (fMeasureFPS) {
994796763e0b2c06a7789185322561a1135e5484688djsollen@google.com        fMeasureFPS_Time = 0;
995796763e0b2c06a7789185322561a1135e5484688djsollen@google.com    }
996796763e0b2c06a7789185322561a1135e5484688djsollen@google.com
997f7f79d2a6e669058ee9bb9fc4f0a9e998bfc5da6reed    SkSize tile = this->tileSize();
9982e7b43d33cc495663cb814a7a9d1ecdc09c31828bsalomon@google.com
999f7f79d2a6e669058ee9bb9fc4f0a9e998bfc5da6reed    if (kNo_Tiling == fTilingMode) {
1000f7f79d2a6e669058ee9bb9fc4f0a9e998bfc5da6reed        this->INHERITED::draw(canvas); // no looping or surfaces needed
1001e522ca5d5f249bd51a00cb68bb051f811d0a9e85reed@android.com    } else {
1002f7f79d2a6e669058ee9bb9fc4f0a9e998bfc5da6reed        const int w = SkScalarRoundToInt(tile.width());
1003f7f79d2a6e669058ee9bb9fc4f0a9e998bfc5da6reed        const int h = SkScalarRoundToInt(tile.height());
1004f7f79d2a6e669058ee9bb9fc4f0a9e998bfc5da6reed        SkImageInfo info = SkImageInfo::MakeN32Premul(w, h);
1005f7f79d2a6e669058ee9bb9fc4f0a9e998bfc5da6reed        SkAutoTUnref<SkSurface> surface(canvas->newSurface(info));
1006f7f79d2a6e669058ee9bb9fc4f0a9e998bfc5da6reed        SkCanvas* tileCanvas = surface->getCanvas();
1007f7f79d2a6e669058ee9bb9fc4f0a9e998bfc5da6reed
1008f7f79d2a6e669058ee9bb9fc4f0a9e998bfc5da6reed        for (SkScalar y = 0; y < height(); y += tile.height()) {
1009f7f79d2a6e669058ee9bb9fc4f0a9e998bfc5da6reed            for (SkScalar x = 0; x < width(); x += tile.width()) {
1010f7f79d2a6e669058ee9bb9fc4f0a9e998bfc5da6reed                SkAutoCanvasRestore acr(tileCanvas, true);
1011f7f79d2a6e669058ee9bb9fc4f0a9e998bfc5da6reed                tileCanvas->translate(-x, -y);
1012f7f79d2a6e669058ee9bb9fc4f0a9e998bfc5da6reed                tileCanvas->clear(0);
1013f7f79d2a6e669058ee9bb9fc4f0a9e998bfc5da6reed                this->INHERITED::draw(tileCanvas);
1014f7f79d2a6e669058ee9bb9fc4f0a9e998bfc5da6reed                surface->draw(canvas, x, y, NULL);
101585cade0a10217a50aebb495099ecc0435fe08b23scroggo@google.com            }
1016f7f79d2a6e669058ee9bb9fc4f0a9e998bfc5da6reed        }
1017ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com
1018f7f79d2a6e669058ee9bb9fc4f0a9e998bfc5da6reed        // for drawing the borders between tiles
1019f7f79d2a6e669058ee9bb9fc4f0a9e998bfc5da6reed        SkPaint paint;
1020f7f79d2a6e669058ee9bb9fc4f0a9e998bfc5da6reed        paint.setColor(0x60FF00FF);
1021f7f79d2a6e669058ee9bb9fc4f0a9e998bfc5da6reed        paint.setStyle(SkPaint::kStroke_Style);
1022cc63b32eb8702bfa4d965fa443cf00fc1c1d10b7commit-bot@chromium.org
1023f7f79d2a6e669058ee9bb9fc4f0a9e998bfc5da6reed        for (SkScalar y = 0; y < height(); y += tile.height()) {
1024f7f79d2a6e669058ee9bb9fc4f0a9e998bfc5da6reed            for (SkScalar x = 0; x < width(); x += tile.width()) {
1025f7f79d2a6e669058ee9bb9fc4f0a9e998bfc5da6reed                canvas->drawRect(SkRect::MakeXYWH(x, y, tile.width(), tile.height()), paint);
102685cade0a10217a50aebb495099ecc0435fe08b23scroggo@google.com            }
102785cade0a10217a50aebb495099ecc0435fe08b23scroggo@google.com        }
1028e522ca5d5f249bd51a00cb68bb051f811d0a9e85reed@android.com    }
1029f7f79d2a6e669058ee9bb9fc4f0a9e998bfc5da6reed
1030098e96df6ab0327f18537c7006ff2b0b4116ee30bsalomon@google.com    if (fShowZoomer && !fSaveToPdf) {
10313272ba8abcf322f5e9bcf2f7f2dcddaf68550268Scroggo        showZoomer(canvas);
10323272ba8abcf322f5e9bcf2f7f2dcddaf68550268Scroggo    }
1033db03eaa37111a63835ab7f61cb550971e609a621yangsu@google.com    if (fMagnify && !fSaveToPdf) {
1034db03eaa37111a63835ab7f61cb550971e609a621yangsu@google.com        magnify(canvas);
1035db03eaa37111a63835ab7f61cb550971e609a621yangsu@google.com    }
10364605a3f3ff8fa2072f98e6bcb71bc43d4c6196d6chudy@google.com
1037796763e0b2c06a7789185322561a1135e5484688djsollen@google.com    if (fMeasureFPS && fMeasureFPS_Time) {
1038796763e0b2c06a7789185322561a1135e5484688djsollen@google.com        this->updateTitle();
1039796763e0b2c06a7789185322561a1135e5484688djsollen@google.com        this->postInvalDelay();
1040796763e0b2c06a7789185322561a1135e5484688djsollen@google.com    }
1041796763e0b2c06a7789185322561a1135e5484688djsollen@google.com
1042d9adfe6a223955bc69c8c7661ab8e0a078afbc32reed    if (this->sendAnimatePulse()) {
1043d9adfe6a223955bc69c8c7661ab8e0a078afbc32reed        this->inval(NULL);
1044d9adfe6a223955bc69c8c7661ab8e0a078afbc32reed    }
1045d9adfe6a223955bc69c8c7661ab8e0a078afbc32reed
104629038ed2ab5cb87fda5a2a4d3267f0a5aa227a3dreed@google.com    // do this last
1047098e96df6ab0327f18537c7006ff2b0b4116ee30bsalomon@google.com    fDevManager->publishCanvas(fDeviceType, canvas, this);
10483272ba8abcf322f5e9bcf2f7f2dcddaf68550268Scroggo}
10493272ba8abcf322f5e9bcf2f7f2dcddaf68550268Scroggo
1050db03eaa37111a63835ab7f61cb550971e609a621yangsu@google.comstatic float clipW = 200;
1051db03eaa37111a63835ab7f61cb550971e609a621yangsu@google.comstatic float clipH = 200;
1052db03eaa37111a63835ab7f61cb550971e609a621yangsu@google.comvoid SampleWindow::magnify(SkCanvas* canvas) {
1053db03eaa37111a63835ab7f61cb550971e609a621yangsu@google.com    SkRect r;
1054db03eaa37111a63835ab7f61cb550971e609a621yangsu@google.com    int count = canvas->save();
10554605a3f3ff8fa2072f98e6bcb71bc43d4c6196d6chudy@google.com
1056db03eaa37111a63835ab7f61cb550971e609a621yangsu@google.com    SkMatrix m = canvas->getTotalMatrix();
105707ef911f18e30566d8a9d790e0bd69a836fd9d24robertphillips@google.com    if (!m.invert(&m)) {
105807ef911f18e30566d8a9d790e0bd69a836fd9d24robertphillips@google.com        return;
105907ef911f18e30566d8a9d790e0bd69a836fd9d24robertphillips@google.com    }
1060db03eaa37111a63835ab7f61cb550971e609a621yangsu@google.com    SkPoint offset, center;
1061820e80ad6390e120d4991a5280d0452ec87beaebbsalomon@google.com    SkScalar mouseX = fMouseX * SK_Scalar1;
1062820e80ad6390e120d4991a5280d0452ec87beaebbsalomon@google.com    SkScalar mouseY = fMouseY * SK_Scalar1;
1063820e80ad6390e120d4991a5280d0452ec87beaebbsalomon@google.com    m.mapXY(mouseX - clipW/2, mouseY - clipH/2, &offset);
1064820e80ad6390e120d4991a5280d0452ec87beaebbsalomon@google.com    m.mapXY(mouseX, mouseY, &center);
10654605a3f3ff8fa2072f98e6bcb71bc43d4c6196d6chudy@google.com
1066db03eaa37111a63835ab7f61cb550971e609a621yangsu@google.com    r.set(0, 0, clipW * m.getScaleX(), clipH * m.getScaleX());
1067db03eaa37111a63835ab7f61cb550971e609a621yangsu@google.com    r.offset(offset.fX, offset.fY);
10684605a3f3ff8fa2072f98e6bcb71bc43d4c6196d6chudy@google.com
1069db03eaa37111a63835ab7f61cb550971e609a621yangsu@google.com    SkPaint paint;
1070db03eaa37111a63835ab7f61cb550971e609a621yangsu@google.com    paint.setColor(0xFF66AAEE);
1071db03eaa37111a63835ab7f61cb550971e609a621yangsu@google.com    paint.setStyle(SkPaint::kStroke_Style);
1072820e80ad6390e120d4991a5280d0452ec87beaebbsalomon@google.com    paint.setStrokeWidth(10.f * m.getScaleX());
1073db03eaa37111a63835ab7f61cb550971e609a621yangsu@google.com    //lense offset
1074db03eaa37111a63835ab7f61cb550971e609a621yangsu@google.com    //canvas->translate(0, -250);
1075db03eaa37111a63835ab7f61cb550971e609a621yangsu@google.com    canvas->drawRect(r, paint);
1076db03eaa37111a63835ab7f61cb550971e609a621yangsu@google.com    canvas->clipRect(r);
10774605a3f3ff8fa2072f98e6bcb71bc43d4c6196d6chudy@google.com
1078db03eaa37111a63835ab7f61cb550971e609a621yangsu@google.com    m = canvas->getTotalMatrix();
1079db03eaa37111a63835ab7f61cb550971e609a621yangsu@google.com    m.setTranslate(-center.fX, -center.fY);
1080820e80ad6390e120d4991a5280d0452ec87beaebbsalomon@google.com    m.postScale(0.5f * fFatBitsScale, 0.5f * fFatBitsScale);
1081db03eaa37111a63835ab7f61cb550971e609a621yangsu@google.com    m.postTranslate(center.fX, center.fY);
1082db03eaa37111a63835ab7f61cb550971e609a621yangsu@google.com    canvas->concat(m);
10834605a3f3ff8fa2072f98e6bcb71bc43d4c6196d6chudy@google.com
1084db03eaa37111a63835ab7f61cb550971e609a621yangsu@google.com    this->INHERITED::draw(canvas);
10854605a3f3ff8fa2072f98e6bcb71bc43d4c6196d6chudy@google.com
1086db03eaa37111a63835ab7f61cb550971e609a621yangsu@google.com    canvas->restoreToCount(count);
1087db03eaa37111a63835ab7f61cb550971e609a621yangsu@google.com}
1088db03eaa37111a63835ab7f61cb550971e609a621yangsu@google.com
10893272ba8abcf322f5e9bcf2f7f2dcddaf68550268Scroggovoid SampleWindow::showZoomer(SkCanvas* canvas) {
10900f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo        int count = canvas->save();
10910f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo        canvas->resetMatrix();
10920f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo        // Ensure the mouse position is on screen.
1093e1ca705cac4b946993f6cbf798e2a0ba27e739f3reed@google.com        int width = SkScalarRoundToInt(this->width());
1094e1ca705cac4b946993f6cbf798e2a0ba27e739f3reed@google.com        int height = SkScalarRoundToInt(this->height());
10950f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo        if (fMouseX >= width) fMouseX = width - 1;
10960f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo        else if (fMouseX < 0) fMouseX = 0;
10970f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo        if (fMouseY >= height) fMouseY = height - 1;
10980f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo        else if (fMouseY < 0) fMouseY = 0;
1099b36334d46a488c2d4104a2cabf406cac0585f27ereed@google.com
11000f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo        SkBitmap bitmap = capture_bitmap(canvas);
1101b36334d46a488c2d4104a2cabf406cac0585f27ereed@google.com        bitmap.lockPixels();
1102b36334d46a488c2d4104a2cabf406cac0585f27ereed@google.com
11030f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo        // Find the size of the zoomed in view, forced to be odd, so the examined pixel is in the middle.
11043ce59dc4999de5d6c6913af662c8b0b8020a4ef7mike@reedtribe.org        int zoomedWidth = (width >> 1) | 1;
11053ce59dc4999de5d6c6913af662c8b0b8020a4ef7mike@reedtribe.org        int zoomedHeight = (height >> 1) | 1;
11060f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo        SkIRect src;
11070f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo        src.set(0, 0, zoomedWidth / fFatBitsScale, zoomedHeight / fFatBitsScale);
11080f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo        src.offset(fMouseX - (src.width()>>1), fMouseY - (src.height()>>1));
11090f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo        SkRect dest;
11100f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo        dest.set(0, 0, SkIntToScalar(zoomedWidth), SkIntToScalar(zoomedHeight));
11110f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo        dest.offset(SkIntToScalar(width - zoomedWidth), SkIntToScalar(height - zoomedHeight));
11120f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo        SkPaint paint;
11130f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo        // Clear the background behind our zoomed in view
11140f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo        paint.setColor(SK_ColorWHITE);
11150f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo        canvas->drawRect(dest, paint);
11160f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo        canvas->drawBitmapRect(bitmap, &src, dest);
11170f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo        paint.setColor(SK_ColorBLACK);
11180f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo        paint.setStyle(SkPaint::kStroke_Style);
11190f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo        // Draw a border around the pixel in the middle
11200f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo        SkRect originalPixel;
11210f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo        originalPixel.set(SkIntToScalar(fMouseX), SkIntToScalar(fMouseY), SkIntToScalar(fMouseX + 1), SkIntToScalar(fMouseY + 1));
11220f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo        SkMatrix matrix;
11230f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo        SkRect scalarSrc;
11240f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo        scalarSrc.set(src);
11250f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo        SkColor color = bitmap.getColor(fMouseX, fMouseY);
11260f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo        if (matrix.setRectToRect(scalarSrc, dest, SkMatrix::kFill_ScaleToFit)) {
11270f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo            SkRect pixel;
11280f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo            matrix.mapRect(&pixel, originalPixel);
11290f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo            // TODO Perhaps measure the values and make the outline white if it's "dark"
11300f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo            if (color == SK_ColorBLACK) {
11310f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo                paint.setColor(SK_ColorWHITE);
11320f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo            }
11330f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo            canvas->drawRect(pixel, paint);
11340f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo        }
11350f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo        paint.setColor(SK_ColorBLACK);
11360f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo        // Draw a border around the destination rectangle
11370f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo        canvas->drawRect(dest, paint);
11380f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo        paint.setStyle(SkPaint::kStrokeAndFill_Style);
11390f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo        // Identify the pixel and its color on screen
11400f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo        paint.setTypeface(fTypeface);
11410f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo        paint.setAntiAlias(true);
11420f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo        SkScalar lineHeight = paint.getFontMetrics(NULL);
11430f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo        SkString string;
11440f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo        string.appendf("(%i, %i)", fMouseX, fMouseY);
11450f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo        SkScalar left = dest.fLeft + SkIntToScalar(3);
11460f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo        SkScalar i = SK_Scalar1;
11470f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo        drawText(canvas, string, left, SkScalarMulAdd(lineHeight, i, dest.fTop), paint);
11480f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo        // Alpha
11490f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo        i += SK_Scalar1;
11500f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo        string.reset();
11510f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo        string.appendf("A: %X", SkColorGetA(color));
11520f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo        drawText(canvas, string, left, SkScalarMulAdd(lineHeight, i, dest.fTop), paint);
11530f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo        // Red
11540f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo        i += SK_Scalar1;
11550f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo        string.reset();
11560f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo        string.appendf("R: %X", SkColorGetR(color));
11570f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo        paint.setColor(SK_ColorRED);
11580f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo        drawText(canvas, string, left, SkScalarMulAdd(lineHeight, i, dest.fTop), paint);
11590f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo        // Green
11600f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo        i += SK_Scalar1;
11610f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo        string.reset();
11620f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo        string.appendf("G: %X", SkColorGetG(color));
11630f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo        paint.setColor(SK_ColorGREEN);
11640f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo        drawText(canvas, string, left, SkScalarMulAdd(lineHeight, i, dest.fTop), paint);
11650f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo        // Blue
11660f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo        i += SK_Scalar1;
11670f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo        string.reset();
11680f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo        string.appendf("B: %X", SkColorGetB(color));
11690f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo        paint.setColor(SK_ColorBLUE);
11700f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo        drawText(canvas, string, left, SkScalarMulAdd(lineHeight, i, dest.fTop), paint);
11710f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo        canvas->restoreToCount(count);
1172e522ca5d5f249bd51a00cb68bb051f811d0a9e85reed@android.com}
1173e522ca5d5f249bd51a00cb68bb051f811d0a9e85reed@android.com
11748a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comvoid SampleWindow::onDraw(SkCanvas* canvas) {
11758a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
11768a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
11778a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkColorPriv.h"
11788a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
11798ac0d542b0226e68b0faa935b3402ffc91409a02Scroggovoid SampleWindow::saveToPdf()
11808ac0d542b0226e68b0faa935b3402ffc91409a02Scroggo{
11818ac0d542b0226e68b0faa935b3402ffc91409a02Scroggo    fSaveToPdf = true;
11828ac0d542b0226e68b0faa935b3402ffc91409a02Scroggo    this->inval(NULL);
11838ac0d542b0226e68b0faa935b3402ffc91409a02Scroggo}
11848ac0d542b0226e68b0faa935b3402ffc91409a02Scroggo
11858a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comSkCanvas* SampleWindow::beforeChildren(SkCanvas* canvas) {
11868ac0d542b0226e68b0faa935b3402ffc91409a02Scroggo    if (fSaveToPdf) {
1187ddb5eca198736a320b8318eb5f6dfd6d0b6ad1d3reed        SkString name;
1188ddb5eca198736a320b8318eb5f6dfd6d0b6ad1d3reed        if (!this->getRawTitle(&name)) {
1189ddb5eca198736a320b8318eb5f6dfd6d0b6ad1d3reed            name.set("unknown_sample");
1190ddb5eca198736a320b8318eb5f6dfd6d0b6ad1d3reed        }
1191ddb5eca198736a320b8318eb5f6dfd6d0b6ad1d3reed        name.append(".pdf");
1192ddb5eca198736a320b8318eb5f6dfd6d0b6ad1d3reed#ifdef SK_BUILD_FOR_ANDROID
1193ddb5eca198736a320b8318eb5f6dfd6d0b6ad1d3reed        name.prepend("/sdcard/");
1194ddb5eca198736a320b8318eb5f6dfd6d0b6ad1d3reed#endif
1195ddb5eca198736a320b8318eb5f6dfd6d0b6ad1d3reed        fPDFDocument.reset(SkDocument::CreatePDF(name.c_str()));
1196ddb5eca198736a320b8318eb5f6dfd6d0b6ad1d3reed        canvas = fPDFDocument->beginPage(this->width(), this->height());
119782502e2e3966a9b0e48665f20154eaacd2a452b3bsalomon@google.com    } else if (kPicture_DeviceType == fDeviceType) {
11985fb2ce38b3dcb8e60e9e112df23c9d42456d7069commit-bot@chromium.org        canvas = fRecorder.beginRecording(9999, 9999, NULL, 0);
1199beedb81a7fa9bd1274d64b2c000ef6ee23c9a810reed    } else if (kDeferred_DeviceType == fDeviceType) {
1200beedb81a7fa9bd1274d64b2c000ef6ee23c9a810reed        fDeferredSurface.reset(canvas->newSurface(canvas->imageInfo()));
1201beedb81a7fa9bd1274d64b2c000ef6ee23c9a810reed        if (fDeferredSurface.get()) {
1202beedb81a7fa9bd1274d64b2c000ef6ee23c9a810reed            fDeferredCanvas.reset(SkDeferredCanvas::Create(fDeferredSurface));
1203beedb81a7fa9bd1274d64b2c000ef6ee23c9a810reed            canvas = fDeferredCanvas;
1204beedb81a7fa9bd1274d64b2c000ef6ee23c9a810reed        }
12058ac0d542b0226e68b0faa935b3402ffc91409a02Scroggo    } else {
1206bb0502eec5c66ddd2f54330711010aabfa1c2176bsalomon        canvas = this->INHERITED::beforeChildren(canvas);
12078a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    }
12088a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
12098a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    if (fUseClip) {
12108a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        canvas->drawColor(0xFFFF88FF);
1211045e62d715f5ee9b03deb5af3c750f8318096179reed@google.com        canvas->clipPath(fClipPath, SkRegion::kIntersect_Op, true);
12128a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    }
12138a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
12148a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    return canvas;
12158a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
121689889b69391a730f0ba2a1efb549864b7762263freed#include "SkMultiPictureDraw.h"
12178a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comvoid SampleWindow::afterChildren(SkCanvas* orig) {
12188ac0d542b0226e68b0faa935b3402ffc91409a02Scroggo    if (fSaveToPdf) {
12198ac0d542b0226e68b0faa935b3402ffc91409a02Scroggo        fSaveToPdf = false;
1220ddb5eca198736a320b8318eb5f6dfd6d0b6ad1d3reed        fPDFDocument->endPage();
1221ddb5eca198736a320b8318eb5f6dfd6d0b6ad1d3reed        fPDFDocument.reset(NULL);
12228ac0d542b0226e68b0faa935b3402ffc91409a02Scroggo        // We took over the draw calls in order to create the PDF, so we need
12238ac0d542b0226e68b0faa935b3402ffc91409a02Scroggo        // to redraw.
12248ac0d542b0226e68b0faa935b3402ffc91409a02Scroggo        this->inval(NULL);
12258ac0d542b0226e68b0faa935b3402ffc91409a02Scroggo        return;
12268ac0d542b0226e68b0faa935b3402ffc91409a02Scroggo    }
12274605a3f3ff8fa2072f98e6bcb71bc43d4c6196d6chudy@google.com
1228f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com    if (fRequestGrabImage) {
1229f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com        fRequestGrabImage = false;
12302e7b43d33cc495663cb814a7a9d1ecdc09c31828bsalomon@google.com
123152d9ac6c92ddf33b3b05eb77ba9509a7aa441657reed        SkBitmap bmp = capture_bitmap(orig);
123252d9ac6c92ddf33b3b05eb77ba9509a7aa441657reed        if (!bmp.isNull()) {
1233f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com            static int gSampleGrabCounter;
1234f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com            SkString name;
12357c57e0e7ccb05a4b7ce05b883ba06380d5578881reed@google.com            name.printf("sample_grab_%d.png", gSampleGrabCounter++);
1236669fdc4ed8ed461a141cb97d0afdd9ef72a82be1bsalomon@google.com            SkImageEncoder::EncodeFile(name.c_str(), bmp,
1237f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com                                       SkImageEncoder::kPNG_Type, 100);
1238f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com        }
1239f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com    }
1240f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com
1241098e96df6ab0327f18537c7006ff2b0b4116ee30bsalomon@google.com    if (kPicture_DeviceType == fDeviceType) {
1242dd528967fc3eea54c8d10937b0100192d0722f4erobertphillips        SkAutoTUnref<const SkPicture> picture(fRecorder.endRecording());
124384b18c7e3e042bf206e1ace3d1b6ea5bb929fe51robertphillips@google.com
1244098e96df6ab0327f18537c7006ff2b0b4116ee30bsalomon@google.com        if (true) {
1245e23f194bf9747267b9dd42e238dfe217ed585c03reed@google.com            this->installDrawFilter(orig);
124689889b69391a730f0ba2a1efb549864b7762263freed
124789889b69391a730f0ba2a1efb549864b7762263freed            if (true) {
124889889b69391a730f0ba2a1efb549864b7762263freed                SkImageInfo info;
124989889b69391a730f0ba2a1efb549864b7762263freed                size_t rowBytes;
125089889b69391a730f0ba2a1efb549864b7762263freed                void* addr = orig->accessTopLayerPixels(&info, &rowBytes);
125189889b69391a730f0ba2a1efb549864b7762263freed                if (addr) {
125289889b69391a730f0ba2a1efb549864b7762263freed                    SkSurface* surfs[4];
125389889b69391a730f0ba2a1efb549864b7762263freed                    SkMultiPictureDraw md;
125489889b69391a730f0ba2a1efb549864b7762263freed
125589889b69391a730f0ba2a1efb549864b7762263freed                    SkImageInfo n = SkImageInfo::Make(info.width()/2, info.height()/2,
125689889b69391a730f0ba2a1efb549864b7762263freed                                                      info.colorType(), info.alphaType());
125789889b69391a730f0ba2a1efb549864b7762263freed                    int index = 0;
125889889b69391a730f0ba2a1efb549864b7762263freed                    for (int y = 0; y < 2; ++y) {
125989889b69391a730f0ba2a1efb549864b7762263freed                        for (int x = 0; x < 2; ++x) {
126089889b69391a730f0ba2a1efb549864b7762263freed                            char* p = (char*)addr;
126189889b69391a730f0ba2a1efb549864b7762263freed                            p += y * n.height() * rowBytes;
126289889b69391a730f0ba2a1efb549864b7762263freed                            p += x * n.width() * sizeof(SkPMColor);
126389889b69391a730f0ba2a1efb549864b7762263freed                            surfs[index] = SkSurface::NewRasterDirect(n, p, rowBytes);
126489889b69391a730f0ba2a1efb549864b7762263freed                            SkCanvas* c = surfs[index]->getCanvas();
126589889b69391a730f0ba2a1efb549864b7762263freed                            c->translate(SkIntToScalar(-x * n.width()),
126689889b69391a730f0ba2a1efb549864b7762263freed                                         SkIntToScalar(-y * n.height()));
12677a2c8f3f28ff58432af313f2022a30164f5633dcfmalita                            c->concat(orig->getTotalMatrix());
126889889b69391a730f0ba2a1efb549864b7762263freed                            md.add(c, picture, NULL, NULL);
126989889b69391a730f0ba2a1efb549864b7762263freed                            index++;
127089889b69391a730f0ba2a1efb549864b7762263freed                        }
127189889b69391a730f0ba2a1efb549864b7762263freed                    }
127289889b69391a730f0ba2a1efb549864b7762263freed                    md.draw();
127389889b69391a730f0ba2a1efb549864b7762263freed                    for (int i = 0; i < 4; ++i) {
127489889b69391a730f0ba2a1efb549864b7762263freed                        surfs[i]->unref();
127589889b69391a730f0ba2a1efb549864b7762263freed                    }
127689889b69391a730f0ba2a1efb549864b7762263freed                }
127789889b69391a730f0ba2a1efb549864b7762263freed            } else {
127889889b69391a730f0ba2a1efb549864b7762263freed                orig->drawPicture(picture);
127989889b69391a730f0ba2a1efb549864b7762263freed            }
1280098e96df6ab0327f18537c7006ff2b0b4116ee30bsalomon@google.com        } else if (true) {
1281098e96df6ab0327f18537c7006ff2b0b4116ee30bsalomon@google.com            SkDynamicMemoryWStream ostream;
128284b18c7e3e042bf206e1ace3d1b6ea5bb929fe51robertphillips@google.com            picture->serialize(&ostream);
1283098e96df6ab0327f18537c7006ff2b0b4116ee30bsalomon@google.com
1284098e96df6ab0327f18537c7006ff2b0b4116ee30bsalomon@google.com            SkAutoDataUnref data(ostream.copyToData());
128559f46b81f8bdd1b524f5cc43bc27603f9604c71arobertphillips@google.com            SkMemoryStream istream(data->data(), data->size());
1286f1754ec69131801c1a6ed3c704501a9400bbf324scroggo@google.com            SkAutoTUnref<SkPicture> pict(SkPicture::CreateFromStream(&istream));
1287f1754ec69131801c1a6ed3c704501a9400bbf324scroggo@google.com            if (pict.get() != NULL) {
12889b14f26d0f3a974f3dd626c8354e1db1cfcd322frobertphillips                orig->drawPicture(pict.get());
1289f1754ec69131801c1a6ed3c704501a9400bbf324scroggo@google.com            }
1290098e96df6ab0327f18537c7006ff2b0b4116ee30bsalomon@google.com        } else {
1291c5ba71d2e5cd426def66fa49dcf003e5b2c98dc7robertphillips            picture->playback(orig);
1292098e96df6ab0327f18537c7006ff2b0b4116ee30bsalomon@google.com        }
1293beedb81a7fa9bd1274d64b2c000ef6ee23c9a810reed    } else if (kDeferred_DeviceType == fDeviceType) {
1294beedb81a7fa9bd1274d64b2c000ef6ee23c9a810reed        SkAutoTUnref<SkImage> image(fDeferredCanvas->newImageSnapshot());
1295beedb81a7fa9bd1274d64b2c000ef6ee23c9a810reed        if (image) {
1296beedb81a7fa9bd1274d64b2c000ef6ee23c9a810reed            orig->drawImage(image, 0, 0, NULL);
1297beedb81a7fa9bd1274d64b2c000ef6ee23c9a810reed        }
1298beedb81a7fa9bd1274d64b2c000ef6ee23c9a810reed        fDeferredCanvas.reset(NULL);
1299beedb81a7fa9bd1274d64b2c000ef6ee23c9a810reed        fDeferredSurface.reset(NULL);
13008a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    }
13012e7b43d33cc495663cb814a7a9d1ecdc09c31828bsalomon@google.com
130217d7aec8967f7e2f6bb420c6647be11285fac2f1reed@google.com    // Do this after presentGL and other finishing, rather than in afterChild
1303796763e0b2c06a7789185322561a1135e5484688djsollen@google.com    if (fMeasureFPS && fMeasureFPS_StartTime) {
1304796763e0b2c06a7789185322561a1135e5484688djsollen@google.com        fMeasureFPS_Time += SkTime::GetMSecs() - fMeasureFPS_StartTime;
130517d7aec8967f7e2f6bb420c6647be11285fac2f1reed@google.com    }
13068a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
13078a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
13086c5f6f25b43f1210decb48956c1a2fbe5b58f889reed@android.comvoid SampleWindow::beforeChild(SkView* child, SkCanvas* canvas) {
13096c5f6f25b43f1210decb48956c1a2fbe5b58f889reed@android.com    if (fRotate) {
13106c5f6f25b43f1210decb48956c1a2fbe5b58f889reed@android.com        SkScalar cx = this->width() / 2;
13116c5f6f25b43f1210decb48956c1a2fbe5b58f889reed@android.com        SkScalar cy = this->height() / 2;
13126c5f6f25b43f1210decb48956c1a2fbe5b58f889reed@android.com        canvas->translate(cx, cy);
131376113a9b7716748c70ea0ecf7aacbabe4cce5009reed        canvas->rotate(gAnimTimer.scaled(10));
13146c5f6f25b43f1210decb48956c1a2fbe5b58f889reed@android.com        canvas->translate(-cx, -cy);
13156c5f6f25b43f1210decb48956c1a2fbe5b58f889reed@android.com    }
1316b17859133aeb0ebe80805fbd437759e2b956d859bungeman@google.com
1317e8f091093509d946a7f6722b40033a3dc946dc0fbsalomon@google.com    if (fPerspAnim) {
131876113a9b7716748c70ea0ecf7aacbabe4cce5009reed        SkScalar secs = gAnimTimer.scaled(1);
13196fb736fc2ea5f3f7ac44494211cc6755180ca192bsalomon@google.com
13206fb736fc2ea5f3f7ac44494211cc6755180ca192bsalomon@google.com        static const SkScalar gAnimPeriod = 10 * SK_Scalar1;
13216fb736fc2ea5f3f7ac44494211cc6755180ca192bsalomon@google.com        static const SkScalar gAnimMag = SK_Scalar1 / 1000;
132276113a9b7716748c70ea0ecf7aacbabe4cce5009reed        SkScalar t = SkScalarMod(secs, gAnimPeriod);
132380ea19ca4bdd68c1493666a5fe7e4ce9d43ded8breed        if (SkScalarFloorToInt(secs / gAnimPeriod) & 0x1) {
13246fb736fc2ea5f3f7ac44494211cc6755180ca192bsalomon@google.com            t = gAnimPeriod - t;
13256fb736fc2ea5f3f7ac44494211cc6755180ca192bsalomon@google.com        }
13266fb736fc2ea5f3f7ac44494211cc6755180ca192bsalomon@google.com        t = 2 * t - gAnimPeriod;
132780ea19ca4bdd68c1493666a5fe7e4ce9d43ded8breed        t *= gAnimMag / gAnimPeriod;
13286fb736fc2ea5f3f7ac44494211cc6755180ca192bsalomon@google.com        SkMatrix m;
13296fb736fc2ea5f3f7ac44494211cc6755180ca192bsalomon@google.com        m.reset();
13305d9ab2816f5e595a5b7cba9d4b7fae169e21c66ereed#if 1
13316fb736fc2ea5f3f7ac44494211cc6755180ca192bsalomon@google.com        m.setPerspY(t);
13325d9ab2816f5e595a5b7cba9d4b7fae169e21c66ereed#else
13335d9ab2816f5e595a5b7cba9d4b7fae169e21c66ereed        m.setPerspY(SK_Scalar1 / 1000);
133480ea19ca4bdd68c1493666a5fe7e4ce9d43ded8breed        m.setSkewX(8.0f / 25);
13355d9ab2816f5e595a5b7cba9d4b7fae169e21c66ereed        m.dump();
13365d9ab2816f5e595a5b7cba9d4b7fae169e21c66ereed#endif
1337e8f091093509d946a7f6722b40033a3dc946dc0fbsalomon@google.com        canvas->concat(m);
1338e8f091093509d946a7f6722b40033a3dc946dc0fbsalomon@google.com    }
1339f0b5f68807cfa18cce0647d275778147901945cdreed@google.com
1340e23f194bf9747267b9dd42e238dfe217ed585c03reed@google.com    this->installDrawFilter(canvas);
13412eb595292b9624371d1698ae9da7accb4c09c26cmike@reedtribe.org
13422eb595292b9624371d1698ae9da7accb4c09c26cmike@reedtribe.org    if (fMeasureFPS) {
1343f21833999d90ad9c8c584cff3238797b39cfc00breed@google.com        if (SampleView::SetRepeatDraw(child, FPS_REPEAT_COUNT)) {
1344796763e0b2c06a7789185322561a1135e5484688djsollen@google.com            fMeasureFPS_StartTime = SkTime::GetMSecs();
1345f21833999d90ad9c8c584cff3238797b39cfc00breed@google.com        }
1346f21833999d90ad9c8c584cff3238797b39cfc00breed@google.com    } else {
1347f21833999d90ad9c8c584cff3238797b39cfc00breed@google.com        (void)SampleView::SetRepeatDraw(child, 1);
13482eb595292b9624371d1698ae9da7accb4c09c26cmike@reedtribe.org    }
1349b17859133aeb0ebe80805fbd437759e2b956d859bungeman@google.com    if (fPerspAnim || fRotate) {
1350e8f091093509d946a7f6722b40033a3dc946dc0fbsalomon@google.com        this->inval(NULL);
1351e8f091093509d946a7f6722b40033a3dc946dc0fbsalomon@google.com    }
13526c5f6f25b43f1210decb48956c1a2fbe5b58f889reed@android.com}
13536c5f6f25b43f1210decb48956c1a2fbe5b58f889reed@android.com
13546c5f6f25b43f1210decb48956c1a2fbe5b58f889reed@android.comvoid SampleWindow::afterChild(SkView* child, SkCanvas* canvas) {
1355f0b5f68807cfa18cce0647d275778147901945cdreed@google.com    canvas->setDrawFilter(NULL);
13566c5f6f25b43f1210decb48956c1a2fbe5b58f889reed@android.com}
13576c5f6f25b43f1210decb48956c1a2fbe5b58f889reed@android.com
1358e32b5837c3f35b80502759f3de3e8cadf6625f4edjsollen@google.comvoid SampleWindow::changeZoomLevel(float delta) {
13594b413c8bb123e42ca4b9c7bfa6bc2167283cb84ccommit-bot@chromium.org    fZoomLevel += delta;
1360dd0cd34067d103ace7c6739405cb7885d8ad3fb2mike@reedtribe.org    if (fZoomLevel > 0) {
1361e32b5837c3f35b80502759f3de3e8cadf6625f4edjsollen@google.com        fZoomLevel = SkMinScalar(fZoomLevel, MAX_ZOOM_LEVEL);
1362e32b5837c3f35b80502759f3de3e8cadf6625f4edjsollen@google.com        fZoomScale = fZoomLevel + SK_Scalar1;
1363dd0cd34067d103ace7c6739405cb7885d8ad3fb2mike@reedtribe.org    } else if (fZoomLevel < 0) {
1364e32b5837c3f35b80502759f3de3e8cadf6625f4edjsollen@google.com        fZoomLevel = SkMaxScalar(fZoomLevel, MIN_ZOOM_LEVEL);
1365e32b5837c3f35b80502759f3de3e8cadf6625f4edjsollen@google.com        fZoomScale = SK_Scalar1 / (SK_Scalar1 - fZoomLevel);
1366dd0cd34067d103ace7c6739405cb7885d8ad3fb2mike@reedtribe.org    } else {
1367dd0cd34067d103ace7c6739405cb7885d8ad3fb2mike@reedtribe.org        fZoomScale = SK_Scalar1;
1368dd0cd34067d103ace7c6739405cb7885d8ad3fb2mike@reedtribe.org    }
1369f03bb566e25ace918f8fdda3cb8426626a00894creed@google.com    this->updateMatrix();
1370f03bb566e25ace918f8fdda3cb8426626a00894creed@google.com}
1371dd0cd34067d103ace7c6739405cb7885d8ad3fb2mike@reedtribe.org
1372f03bb566e25ace918f8fdda3cb8426626a00894creed@google.comvoid SampleWindow::updateMatrix(){
1373f03bb566e25ace918f8fdda3cb8426626a00894creed@google.com    SkMatrix m;
1374f03bb566e25ace918f8fdda3cb8426626a00894creed@google.com    m.reset();
1375f03bb566e25ace918f8fdda3cb8426626a00894creed@google.com    if (fZoomLevel) {
1376f03bb566e25ace918f8fdda3cb8426626a00894creed@google.com        SkPoint center;
1377f03bb566e25ace918f8fdda3cb8426626a00894creed@google.com        //m = this->getLocalMatrix();//.invert(&m);
1378f03bb566e25ace918f8fdda3cb8426626a00894creed@google.com        m.mapXY(fZoomCenterX, fZoomCenterY, &center);
1379f03bb566e25ace918f8fdda3cb8426626a00894creed@google.com        SkScalar cx = center.fX;
1380f03bb566e25ace918f8fdda3cb8426626a00894creed@google.com        SkScalar cy = center.fY;
13814605a3f3ff8fa2072f98e6bcb71bc43d4c6196d6chudy@google.com
1382f03bb566e25ace918f8fdda3cb8426626a00894creed@google.com        m.setTranslate(-cx, -cy);
1383f03bb566e25ace918f8fdda3cb8426626a00894creed@google.com        m.postScale(fZoomScale, fZoomScale);
1384f03bb566e25ace918f8fdda3cb8426626a00894creed@google.com        m.postTranslate(cx, cy);
1385f03bb566e25ace918f8fdda3cb8426626a00894creed@google.com    }
13864605a3f3ff8fa2072f98e6bcb71bc43d4c6196d6chudy@google.com
1387f03bb566e25ace918f8fdda3cb8426626a00894creed@google.com    if (fFlipAxis) {
1388f03bb566e25ace918f8fdda3cb8426626a00894creed@google.com        m.preTranslate(fZoomCenterX, fZoomCenterY);
1389f03bb566e25ace918f8fdda3cb8426626a00894creed@google.com        if (fFlipAxis & kFlipAxis_X) {
1390f03bb566e25ace918f8fdda3cb8426626a00894creed@google.com            m.preScale(-SK_Scalar1, SK_Scalar1);
1391f03bb566e25ace918f8fdda3cb8426626a00894creed@google.com        }
1392f03bb566e25ace918f8fdda3cb8426626a00894creed@google.com        if (fFlipAxis & kFlipAxis_Y) {
1393f03bb566e25ace918f8fdda3cb8426626a00894creed@google.com            m.preScale(SK_Scalar1, -SK_Scalar1);
1394f03bb566e25ace918f8fdda3cb8426626a00894creed@google.com        }
1395f03bb566e25ace918f8fdda3cb8426626a00894creed@google.com        m.preTranslate(-fZoomCenterX, -fZoomCenterY);
1396f03bb566e25ace918f8fdda3cb8426626a00894creed@google.com        //canvas->concat(m);
1397f03bb566e25ace918f8fdda3cb8426626a00894creed@google.com    }
1398f03bb566e25ace918f8fdda3cb8426626a00894creed@google.com    // Apply any gesture matrix
1399f03bb566e25ace918f8fdda3cb8426626a00894creed@google.com    m.preConcat(fGesture.localM());
1400f03bb566e25ace918f8fdda3cb8426626a00894creed@google.com    m.preConcat(fGesture.globalM());
14014605a3f3ff8fa2072f98e6bcb71bc43d4c6196d6chudy@google.com
1402f03bb566e25ace918f8fdda3cb8426626a00894creed@google.com    this->setLocalMatrix(m);
14034605a3f3ff8fa2072f98e6bcb71bc43d4c6196d6chudy@google.com
1404e32b5837c3f35b80502759f3de3e8cadf6625f4edjsollen@google.com    this->updateTitle();
1405dd0cd34067d103ace7c6739405cb7885d8ad3fb2mike@reedtribe.org    this->inval(NULL);
1406dd0cd34067d103ace7c6739405cb7885d8ad3fb2mike@reedtribe.org}
14072c8208f3a444098aee562f5a1ef620142807eda2Scroggobool SampleWindow::previousSample() {
140862b65b0913566381db468277de07e5dd2a9237caScroggo    fCurrIndex = (fCurrIndex - 1 + fSamples.count()) % fSamples.count();
140963121f0db6ebbefb17f47ec4ec108d77d619fad5reed    this->loadView((*fSamples[fCurrIndex])());
14102c8208f3a444098aee562f5a1ef620142807eda2Scroggo    return true;
14112c8208f3a444098aee562f5a1ef620142807eda2Scroggo}
14122c8208f3a444098aee562f5a1ef620142807eda2Scroggo
14138a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.combool SampleWindow::nextSample() {
141434245c7871f6339de8cc2be8fb1090ca3cba54efreed@android.com    fCurrIndex = (fCurrIndex + 1) % fSamples.count();
141563121f0db6ebbefb17f47ec4ec108d77d619fad5reed    this->loadView((*fSamples[fCurrIndex])());
141634245c7871f6339de8cc2be8fb1090ca3cba54efreed@android.com    return true;
14178a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
14188a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1419501775e5ac99f9805d1aba3aa7ca554a83d2dc43yangsu@google.combool SampleWindow::goToSample(int i) {
1420501775e5ac99f9805d1aba3aa7ca554a83d2dc43yangsu@google.com    fCurrIndex = (i) % fSamples.count();
142163121f0db6ebbefb17f47ec4ec108d77d619fad5reed    this->loadView((*fSamples[fCurrIndex])());
1422501775e5ac99f9805d1aba3aa7ca554a83d2dc43yangsu@google.com    return true;
1423501775e5ac99f9805d1aba3aa7ca554a83d2dc43yangsu@google.com}
1424501775e5ac99f9805d1aba3aa7ca554a83d2dc43yangsu@google.com
1425501775e5ac99f9805d1aba3aa7ca554a83d2dc43yangsu@google.comSkString SampleWindow::getSampleTitle(int i) {
1426f8b6b01d51d08e39499d1c88063af2964fe72a0fedisonn@google.com    return ::getSampleTitle(fSamples[i]);
1427501775e5ac99f9805d1aba3aa7ca554a83d2dc43yangsu@google.com}
1428501775e5ac99f9805d1aba3aa7ca554a83d2dc43yangsu@google.com
1429501775e5ac99f9805d1aba3aa7ca554a83d2dc43yangsu@google.comint SampleWindow::sampleCount() {
1430501775e5ac99f9805d1aba3aa7ca554a83d2dc43yangsu@google.com    return fSamples.count();
1431501775e5ac99f9805d1aba3aa7ca554a83d2dc43yangsu@google.com}
1432501775e5ac99f9805d1aba3aa7ca554a83d2dc43yangsu@google.com
1433db03eaa37111a63835ab7f61cb550971e609a621yangsu@google.comvoid SampleWindow::showOverview() {
143463121f0db6ebbefb17f47ec4ec108d77d619fad5reed    this->loadView(create_overview(fSamples.count(), fSamples.begin()));
1435db03eaa37111a63835ab7f61cb550971e609a621yangsu@google.com}
1436db03eaa37111a63835ab7f61cb550971e609a621yangsu@google.com
1437e23f194bf9747267b9dd42e238dfe217ed585c03reed@google.comvoid SampleWindow::installDrawFilter(SkCanvas* canvas) {
143815bc13d20fe79914c7128881e45064becd11bc9dreed@google.com    canvas->setDrawFilter(new FlagsDrawFilter(fLCDState, fAAState, fSubpixelState,
143993a1215fe0ab007ce941c721f1fd3e9dcb5d4754reed                                              fHintingState, fFilterQualityIndex))->unref();
1440e23f194bf9747267b9dd42e238dfe217ed585c03reed@google.com}
1441e23f194bf9747267b9dd42e238dfe217ed585c03reed@google.com
14422c8208f3a444098aee562f5a1ef620142807eda2Scroggovoid SampleWindow::postAnimatingEvent() {
14432c8208f3a444098aee562f5a1ef620142807eda2Scroggo    if (fAnimating) {
144487fac4abd7ea446c05d5cfd4a8ad27420223b591reed@google.com        (new SkEvent(ANIMATING_EVENTTYPE, this->getSinkID()))->postDelay(ANIMATING_DELAY);
14452c8208f3a444098aee562f5a1ef620142807eda2Scroggo    }
14462c8208f3a444098aee562f5a1ef620142807eda2Scroggo}
1447e23f194bf9747267b9dd42e238dfe217ed585c03reed@google.com
14488a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.combool SampleWindow::onEvent(const SkEvent& evt) {
14492072db89016c4e53a648f4d4cec08b1d6be8558creed@google.com    if (evt.isType(gUpdateWindowTitleEvtName)) {
14502072db89016c4e53a648f4d4cec08b1d6be8558creed@google.com        this->updateTitle();
14512072db89016c4e53a648f4d4cec08b1d6be8558creed@google.com        return true;
14522072db89016c4e53a648f4d4cec08b1d6be8558creed@google.com    }
14538a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    if (evt.isType(ANIMATING_EVENTTYPE)) {
14548a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        if (fAnimating) {
14558a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            this->nextSample();
14568a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            this->postAnimatingEvent();
14578a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        }
14588a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        return true;
14598a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    }
146034245c7871f6339de8cc2be8fb1090ca3cba54efreed@android.com    if (evt.isType("set-curr-index")) {
1461db03eaa37111a63835ab7f61cb550971e609a621yangsu@google.com        this->goToSample(evt.getFast32());
146234245c7871f6339de8cc2be8fb1090ca3cba54efreed@android.com        return true;
146334245c7871f6339de8cc2be8fb1090ca3cba54efreed@android.com    }
14642eb595292b9624371d1698ae9da7accb4c09c26cmike@reedtribe.org    if (isInvalEvent(evt)) {
14652eb595292b9624371d1698ae9da7accb4c09c26cmike@reedtribe.org        this->inval(NULL);
14662eb595292b9624371d1698ae9da7accb4c09c26cmike@reedtribe.org        return true;
14672eb595292b9624371d1698ae9da7accb4c09c26cmike@reedtribe.org    }
1468921091f29e2ecfec55f4d1ac5611b4aa4731e7d6yangsu@google.com    int selected = -1;
1469ef7bdfac618f60e9edc9f42cd4661d563937e6d8yangsu@google.com    if (SkOSMenu::FindListIndex(evt, "Device Type", &selected)) {
1470921091f29e2ecfec55f4d1ac5611b4aa4731e7d6yangsu@google.com        this->setDeviceType((DeviceType)selected);
14714605a3f3ff8fa2072f98e6bcb71bc43d4c6196d6chudy@google.com        return true;
1472921091f29e2ecfec55f4d1ac5611b4aa4731e7d6yangsu@google.com    }
1473b073d920c90bc95f6c216327acd321a4fc809bfascroggo@google.com    if (SkOSMenu::FindTriState(evt, "Pipe", &fPipeState)) {
1474ef7bdfac618f60e9edc9f42cd4661d563937e6d8yangsu@google.com#ifdef PIPE_NET
1475b073d920c90bc95f6c216327acd321a4fc809bfascroggo@google.com        if (!fPipeState != SkOSMenu::kOnState)
1476ef7bdfac618f60e9edc9f42cd4661d563937e6d8yangsu@google.com            gServer.disconnectAll();
1477ef7bdfac618f60e9edc9f42cd4661d563937e6d8yangsu@google.com#endif
1478b073d920c90bc95f6c216327acd321a4fc809bfascroggo@google.com        (void)SampleView::SetUsePipe(curr_view(this), fPipeState);
1479ef7bdfac618f60e9edc9f42cd4661d563937e6d8yangsu@google.com        this->updateTitle();
1480ef7bdfac618f60e9edc9f42cd4661d563937e6d8yangsu@google.com        this->inval(NULL);
1481921091f29e2ecfec55f4d1ac5611b4aa4731e7d6yangsu@google.com        return true;
1482921091f29e2ecfec55f4d1ac5611b4aa4731e7d6yangsu@google.com    }
1483ef7bdfac618f60e9edc9f42cd4661d563937e6d8yangsu@google.com    if (SkOSMenu::FindSwitchState(evt, "Slide Show", NULL)) {
1484921091f29e2ecfec55f4d1ac5611b4aa4731e7d6yangsu@google.com        this->toggleSlideshow();
1485921091f29e2ecfec55f4d1ac5611b4aa4731e7d6yangsu@google.com        return true;
1486921091f29e2ecfec55f4d1ac5611b4aa4731e7d6yangsu@google.com    }
1487ef7bdfac618f60e9edc9f42cd4661d563937e6d8yangsu@google.com    if (SkOSMenu::FindTriState(evt, "AA", &fAAState) ||
1488ef7bdfac618f60e9edc9f42cd4661d563937e6d8yangsu@google.com        SkOSMenu::FindTriState(evt, "LCD", &fLCDState) ||
148993a1215fe0ab007ce941c721f1fd3e9dcb5d4754reed        SkOSMenu::FindListIndex(evt, "FilterQuality", &fFilterQualityIndex) ||
149096aabc850835f6d08a117c0277be93848ddbf785bungeman@google.com        SkOSMenu::FindTriState(evt, "Subpixel", &fSubpixelState) ||
149196aabc850835f6d08a117c0277be93848ddbf785bungeman@google.com        SkOSMenu::FindListIndex(evt, "Hinting", &fHintingState) ||
1492ef7bdfac618f60e9edc9f42cd4661d563937e6d8yangsu@google.com        SkOSMenu::FindSwitchState(evt, "Clip", &fUseClip) ||
1493ef7bdfac618f60e9edc9f42cd4661d563937e6d8yangsu@google.com        SkOSMenu::FindSwitchState(evt, "Zoomer", &fShowZoomer) ||
1494ef7bdfac618f60e9edc9f42cd4661d563937e6d8yangsu@google.com        SkOSMenu::FindSwitchState(evt, "Magnify", &fMagnify) ||
1495ef7bdfac618f60e9edc9f42cd4661d563937e6d8yangsu@google.com        SkOSMenu::FindListIndex(evt, "Transition-Next", &fTransitionNext) ||
1496bbe43a9ce0513d37cbd5dca583c391b7b1e39b3acommit-bot@chromium.org        SkOSMenu::FindListIndex(evt, "Transition-Prev", &fTransitionPrev)) {
1497bbe43a9ce0513d37cbd5dca583c391b7b1e39b3acommit-bot@chromium.org        this->inval(NULL);
1498bbe43a9ce0513d37cbd5dca583c391b7b1e39b3acommit-bot@chromium.org        this->updateTitle();
1499bbe43a9ce0513d37cbd5dca583c391b7b1e39b3acommit-bot@chromium.org        return true;
1500bbe43a9ce0513d37cbd5dca583c391b7b1e39b3acommit-bot@chromium.org    }
1501bbe43a9ce0513d37cbd5dca583c391b7b1e39b3acommit-bot@chromium.org    if (SkOSMenu::FindListIndex(evt, "Tiling", &fTilingMode)) {
1502bbe43a9ce0513d37cbd5dca583c391b7b1e39b3acommit-bot@chromium.org        if (SampleView::IsSampleView(curr_view(this))) {
1503bbe43a9ce0513d37cbd5dca583c391b7b1e39b3acommit-bot@chromium.org            ((SampleView*)curr_view(this))->onTileSizeChanged(this->tileSize());
1504bbe43a9ce0513d37cbd5dca583c391b7b1e39b3acommit-bot@chromium.org        }
1505921091f29e2ecfec55f4d1ac5611b4aa4731e7d6yangsu@google.com        this->inval(NULL);
1506921091f29e2ecfec55f4d1ac5611b4aa4731e7d6yangsu@google.com        this->updateTitle();
1507921091f29e2ecfec55f4d1ac5611b4aa4731e7d6yangsu@google.com        return true;
1508921091f29e2ecfec55f4d1ac5611b4aa4731e7d6yangsu@google.com    }
1509ef7bdfac618f60e9edc9f42cd4661d563937e6d8yangsu@google.com    if (SkOSMenu::FindSwitchState(evt, "Flip X", NULL)) {
1510921091f29e2ecfec55f4d1ac5611b4aa4731e7d6yangsu@google.com        fFlipAxis ^= kFlipAxis_X;
1511f03bb566e25ace918f8fdda3cb8426626a00894creed@google.com        this->updateMatrix();
1512921091f29e2ecfec55f4d1ac5611b4aa4731e7d6yangsu@google.com        return true;
1513921091f29e2ecfec55f4d1ac5611b4aa4731e7d6yangsu@google.com    }
1514ef7bdfac618f60e9edc9f42cd4661d563937e6d8yangsu@google.com    if (SkOSMenu::FindSwitchState(evt, "Flip Y", NULL)) {
1515921091f29e2ecfec55f4d1ac5611b4aa4731e7d6yangsu@google.com        fFlipAxis ^= kFlipAxis_Y;
1516f03bb566e25ace918f8fdda3cb8426626a00894creed@google.com        this->updateMatrix();
1517921091f29e2ecfec55f4d1ac5611b4aa4731e7d6yangsu@google.com        return true;
1518921091f29e2ecfec55f4d1ac5611b4aa4731e7d6yangsu@google.com    }
1519ef7bdfac618f60e9edc9f42cd4661d563937e6d8yangsu@google.com    if (SkOSMenu::FindAction(evt,"Save to PDF")) {
1520921091f29e2ecfec55f4d1ac5611b4aa4731e7d6yangsu@google.com        this->saveToPdf();
1521921091f29e2ecfec55f4d1ac5611b4aa4731e7d6yangsu@google.com        return true;
15224605a3f3ff8fa2072f98e6bcb71bc43d4c6196d6chudy@google.com    }
15238a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    return this->INHERITED::onEvent(evt);
15248a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
15258a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1526f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.combool SampleWindow::onQuery(SkEvent* query) {
1527f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com    if (query->isType("get-slide-count")) {
1528f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com        query->setFast32(fSamples.count());
1529f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com        return true;
1530f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com    }
1531f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com    if (query->isType("get-slide-title")) {
153248dd1a26ec07c5baa04856202e4e7e2a53e4d7e5bsalomon@google.com        SkView* view = (*fSamples[query->getFast32()])();
1533f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com        SkEvent evt(gTitleEvtName);
1534f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com        if (view->doQuery(&evt)) {
1535f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com            query->setString("title", evt.findString(gTitleEvtName));
1536f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com        }
1537f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com        SkSafeUnref(view);
1538f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com        return true;
1539f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com    }
1540f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com    if (query->isType("use-fast-text")) {
1541f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com        SkEvent evt(gFastTextEvtName);
1542f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com        return curr_view(this)->doQuery(&evt);
1543f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com    }
154429038ed2ab5cb87fda5a2a4d3267f0a5aa227a3dreed@google.com    if (query->isType("ignore-window-bitmap")) {
154529038ed2ab5cb87fda5a2a4d3267f0a5aa227a3dreed@google.com        query->setFast32(this->getGrContext() != NULL);
154629038ed2ab5cb87fda5a2a4d3267f0a5aa227a3dreed@google.com        return true;
154729038ed2ab5cb87fda5a2a4d3267f0a5aa227a3dreed@google.com    }
1548f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com    return this->INHERITED::onQuery(query);
1549f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com}
1550f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com
1551992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary ClarkDECLARE_bool(portableFonts);
15525fb6bd4b7e8d00b7f2543ca10ec9022b32632f29caryclark
15538a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.combool SampleWindow::onHandleChar(SkUnichar uni) {
1554f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com    {
1555f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com        SkView* view = curr_view(this);
1556f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com        if (view) {
1557f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com            SkEvent evt(gCharEvtName);
1558f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com            evt.setFast32(uni);
1559f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com            if (view->doQuery(&evt)) {
1560f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com                return true;
1561f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com            }
1562f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com        }
1563f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com    }
15644605a3f3ff8fa2072f98e6bcb71bc43d4c6196d6chudy@google.com
15658a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    int dx = 0xFF;
15668a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    int dy = 0xFF;
15678a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
15688a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    switch (uni) {
15698a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        case '5': dx =  0; dy =  0; break;
15708a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        case '8': dx =  0; dy = -1; break;
15718a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        case '6': dx =  1; dy =  0; break;
15728a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        case '2': dx =  0; dy =  1; break;
15738a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        case '4': dx = -1; dy =  0; break;
15748a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        case '7': dx = -1; dy = -1; break;
15758a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        case '9': dx =  1; dy = -1; break;
15768a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        case '3': dx =  1; dy =  1; break;
15778a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        case '1': dx = -1; dy =  1; break;
15782e7b43d33cc495663cb814a7a9d1ecdc09c31828bsalomon@google.com
15798a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        default:
15808a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            break;
15818a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    }
15822e7b43d33cc495663cb814a7a9d1ecdc09c31828bsalomon@google.com
15838a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    if (0xFF != dx && 0xFF != dy) {
15848a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        if ((dx | dy) == 0) {
15858a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            fScrollTestX = fScrollTestY = 0;
15868a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        } else {
15878a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            fScrollTestX += dx;
15888a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            fScrollTestY += dy;
15898a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        }
15908a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        this->inval(NULL);
15918a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        return true;
15928a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    }
15932e7b43d33cc495663cb814a7a9d1ecdc09c31828bsalomon@google.com
15940ae6b245f2b79bc04f0801b08fcf05abcf98fd6creed@android.com    switch (uni) {
159576113a9b7716748c70ea0ecf7aacbabe4cce5009reed        case 27:    // ESC
159676113a9b7716748c70ea0ecf7aacbabe4cce5009reed            gAnimTimer.stop();
159776113a9b7716748c70ea0ecf7aacbabe4cce5009reed            if (this->sendAnimatePulse()) {
159876113a9b7716748c70ea0ecf7aacbabe4cce5009reed                this->inval(NULL);
159976113a9b7716748c70ea0ecf7aacbabe4cce5009reed            }
160076113a9b7716748c70ea0ecf7aacbabe4cce5009reed            break;
1601d9adfe6a223955bc69c8c7661ab8e0a078afbc32reed        case ' ':
160276113a9b7716748c70ea0ecf7aacbabe4cce5009reed            gAnimTimer.togglePauseResume();
1603d9adfe6a223955bc69c8c7661ab8e0a078afbc32reed            if (this->sendAnimatePulse()) {
1604d9adfe6a223955bc69c8c7661ab8e0a078afbc32reed                this->inval(NULL);
1605d9adfe6a223955bc69c8c7661ab8e0a078afbc32reed            }
1606d9adfe6a223955bc69c8c7661ab8e0a078afbc32reed            break;
1607a4f8137e67e31390b0e7edc5e637a3a02495d1a2reed@google.com        case 'B':
16086de4a7836f1c7988b42cbbfe1a339ef7619aed8fcommit-bot@chromium.org            post_event_to_sink(SkNEW_ARGS(SkEvent, ("PictFileView::toggleBBox")), curr_view(this));
16096de4a7836f1c7988b42cbbfe1a339ef7619aed8fcommit-bot@chromium.org            // Cannot call updateTitle() synchronously, because the toggleBBox event is still in
16106de4a7836f1c7988b42cbbfe1a339ef7619aed8fcommit-bot@chromium.org            // the queue.
16116de4a7836f1c7988b42cbbfe1a339ef7619aed8fcommit-bot@chromium.org            post_event_to_sink(SkNEW_ARGS(SkEvent, (gUpdateWindowTitleEvtName)), this);
1612a4f8137e67e31390b0e7edc5e637a3a02495d1a2reed@google.com            this->inval(NULL);
1613a4f8137e67e31390b0e7edc5e637a3a02495d1a2reed@google.com            break;
16144302ae91b0c97993f7b659474a5fd305921cdc5ereed        case 'D':
16154302ae91b0c97993f7b659474a5fd305921cdc5ereed            toggleDistanceFieldFonts();
16164302ae91b0c97993f7b659474a5fd305921cdc5ereed            break;
1617ef7bdfac618f60e9edc9f42cd4661d563937e6d8yangsu@google.com        case 'f':
16184605a3f3ff8fa2072f98e6bcb71bc43d4c6196d6chudy@google.com            // only
16196ff82553df07ec9502bfe5b4a97a2c2aaf15e39fdjsollen@google.com            toggleFPS();
1620ef7bdfac618f60e9edc9f42cd4661d563937e6d8yangsu@google.com            break;
16215fb6bd4b7e8d00b7f2543ca10ec9022b32632f29caryclark        case 'F':
1622992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark            FLAGS_portableFonts ^= true;
16235fb6bd4b7e8d00b7f2543ca10ec9022b32632f29caryclark            this->inval(NULL);
16245fb6bd4b7e8d00b7f2543ca10ec9022b32632f29caryclark            break;
1625f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com        case 'g':
1626f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com            fRequestGrabImage = true;
1627f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com            this->inval(NULL);
1628a4f8137e67e31390b0e7edc5e637a3a02495d1a2reed@google.com            break;
1629a4f8137e67e31390b0e7edc5e637a3a02495d1a2reed@google.com        case 'G':
1630a4f8137e67e31390b0e7edc5e637a3a02495d1a2reed@google.com            gShowGMBounds = !gShowGMBounds;
16316de4a7836f1c7988b42cbbfe1a339ef7619aed8fcommit-bot@chromium.org            post_event_to_sink(GMSampleView::NewShowSizeEvt(gShowGMBounds),
1632a4f8137e67e31390b0e7edc5e637a3a02495d1a2reed@google.com                            curr_view(this));
1633a4f8137e67e31390b0e7edc5e637a3a02495d1a2reed@google.com            this->inval(NULL);
1634f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com            break;
16352eb595292b9624371d1698ae9da7accb4c09c26cmike@reedtribe.org        case 'i':
16362eb595292b9624371d1698ae9da7accb4c09c26cmike@reedtribe.org            this->zoomIn();
16372eb595292b9624371d1698ae9da7accb4c09c26cmike@reedtribe.org            break;
163808526c07f4f530e56b70d4b22f5a4af35d9ebccascroggo        case 'o':
163908526c07f4f530e56b70d4b22f5a4af35d9ebccascroggo            this->zoomOut();
164008526c07f4f530e56b70d4b22f5a4af35d9ebccascroggo            break;
16412eb595292b9624371d1698ae9da7accb4c09c26cmike@reedtribe.org        case 'r':
16422eb595292b9624371d1698ae9da7accb4c09c26cmike@reedtribe.org            fRotate = !fRotate;
16432eb595292b9624371d1698ae9da7accb4c09c26cmike@reedtribe.org            this->inval(NULL);
16442eb595292b9624371d1698ae9da7accb4c09c26cmike@reedtribe.org            this->updateTitle();
16452eb595292b9624371d1698ae9da7accb4c09c26cmike@reedtribe.org            return true;
1646e8f091093509d946a7f6722b40033a3dc946dc0fbsalomon@google.com        case 'k':
1647e8f091093509d946a7f6722b40033a3dc946dc0fbsalomon@google.com            fPerspAnim = !fPerspAnim;
1648e8f091093509d946a7f6722b40033a3dc946dc0fbsalomon@google.com            this->inval(NULL);
1649e8f091093509d946a7f6722b40033a3dc946dc0fbsalomon@google.com            this->updateTitle();
1650e8f091093509d946a7f6722b40033a3dc946dc0fbsalomon@google.com            return true;
1651cf8fb1f6f03fc77f9927564f9ef9abeeeec508d2bsalomon@google.com#if SK_SUPPORT_GPU
165205e70247c31ae927074ef27ea9893634a8dda543twiz@google.com        case 'p':
165305e70247c31ae927074ef27ea9893634a8dda543twiz@google.com            {
165405e70247c31ae927074ef27ea9893634a8dda543twiz@google.com                GrContext* grContext = this->getGrContext();
165505e70247c31ae927074ef27ea9893634a8dda543twiz@google.com                if (grContext) {
165695c2003740c4cd01fd1b02ed93b9de7227b1d0f5commit-bot@chromium.org                    size_t cacheBytes;
165795c2003740c4cd01fd1b02ed93b9de7227b1d0f5commit-bot@chromium.org                    grContext->getResourceCacheUsage(NULL, &cacheBytes);
165805e70247c31ae927074ef27ea9893634a8dda543twiz@google.com                    grContext->freeGpuResources();
165995c2003740c4cd01fd1b02ed93b9de7227b1d0f5commit-bot@chromium.org                    SkDebugf("Purged %d bytes from the GPU resource cache.\n", cacheBytes);
166005e70247c31ae927074ef27ea9893634a8dda543twiz@google.com                }
166105e70247c31ae927074ef27ea9893634a8dda543twiz@google.com            }
166205e70247c31ae927074ef27ea9893634a8dda543twiz@google.com            return true;
1663cf8fb1f6f03fc77f9927564f9ef9abeeeec508d2bsalomon@google.com#endif
16640ae6b245f2b79bc04f0801b08fcf05abcf98fd6creed@android.com        default:
16650ae6b245f2b79bc04f0801b08fcf05abcf98fd6creed@android.com            break;
16668a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    }
16674605a3f3ff8fa2072f98e6bcb71bc43d4c6196d6chudy@google.com
16687dadc748d96fdf6c1eadc960f1481807d2ac90cfscroggo@google.com    if (fAppMenu->handleKeyEquivalent(uni)|| fSlideMenu->handleKeyEquivalent(uni)) {
16697dadc748d96fdf6c1eadc960f1481807d2ac90cfscroggo@google.com        this->onUpdateMenu(fAppMenu);
16707dadc748d96fdf6c1eadc960f1481807d2ac90cfscroggo@google.com        this->onUpdateMenu(fSlideMenu);
1671db03eaa37111a63835ab7f61cb550971e609a621yangsu@google.com        return true;
1672db03eaa37111a63835ab7f61cb550971e609a621yangsu@google.com    }
16738a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    return this->INHERITED::onHandleChar(uni);
16748a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
16758a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1676921091f29e2ecfec55f4d1ac5611b4aa4731e7d6yangsu@google.comvoid SampleWindow::setDeviceType(DeviceType type) {
1677b442a6d5726569364e15c3056bbfb59b9b6e38cerobertphillips@google.com    if (type == fDeviceType)
1678b442a6d5726569364e15c3056bbfb59b9b6e38cerobertphillips@google.com        return;
1679b442a6d5726569364e15c3056bbfb59b9b6e38cerobertphillips@google.com
1680b442a6d5726569364e15c3056bbfb59b9b6e38cerobertphillips@google.com    fDevManager->tearDownBackend(this);
1681b442a6d5726569364e15c3056bbfb59b9b6e38cerobertphillips@google.com
1682b442a6d5726569364e15c3056bbfb59b9b6e38cerobertphillips@google.com    fDeviceType = type;
1683b442a6d5726569364e15c3056bbfb59b9b6e38cerobertphillips@google.com
16841195925b05ee9d666ea8a8f68fde5d8ca7e49b04bsalomon@google.com    fDevManager->setUpBackend(this, fMSAASampleCount);
1685b442a6d5726569364e15c3056bbfb59b9b6e38cerobertphillips@google.com
1686921091f29e2ecfec55f4d1ac5611b4aa4731e7d6yangsu@google.com    this->updateTitle();
1687921091f29e2ecfec55f4d1ac5611b4aa4731e7d6yangsu@google.com    this->inval(NULL);
1688921091f29e2ecfec55f4d1ac5611b4aa4731e7d6yangsu@google.com}
1689921091f29e2ecfec55f4d1ac5611b4aa4731e7d6yangsu@google.com
16902c8208f3a444098aee562f5a1ef620142807eda2Scroggovoid SampleWindow::toggleSlideshow() {
16912c8208f3a444098aee562f5a1ef620142807eda2Scroggo    fAnimating = !fAnimating;
16922c8208f3a444098aee562f5a1ef620142807eda2Scroggo    this->postAnimatingEvent();
16932c8208f3a444098aee562f5a1ef620142807eda2Scroggo    this->updateTitle();
16942c8208f3a444098aee562f5a1ef620142807eda2Scroggo}
16952c8208f3a444098aee562f5a1ef620142807eda2Scroggo
16962c8208f3a444098aee562f5a1ef620142807eda2Scroggovoid SampleWindow::toggleRendering() {
1697b442a6d5726569364e15c3056bbfb59b9b6e38cerobertphillips@google.com    this->setDeviceType(cycle_devicetype(fDeviceType));
16982c8208f3a444098aee562f5a1ef620142807eda2Scroggo    this->updateTitle();
16992c8208f3a444098aee562f5a1ef620142807eda2Scroggo    this->inval(NULL);
17002c8208f3a444098aee562f5a1ef620142807eda2Scroggo}
17012c8208f3a444098aee562f5a1ef620142807eda2Scroggo
17026ff82553df07ec9502bfe5b4a97a2c2aaf15e39fdjsollen@google.comvoid SampleWindow::toggleFPS() {
17036ff82553df07ec9502bfe5b4a97a2c2aaf15e39fdjsollen@google.com    fMeasureFPS = !fMeasureFPS;
17046ff82553df07ec9502bfe5b4a97a2c2aaf15e39fdjsollen@google.com    this->updateTitle();
17056ff82553df07ec9502bfe5b4a97a2c2aaf15e39fdjsollen@google.com    this->inval(NULL);
17066ff82553df07ec9502bfe5b4a97a2c2aaf15e39fdjsollen@google.com}
17076ff82553df07ec9502bfe5b4a97a2c2aaf15e39fdjsollen@google.com
17084302ae91b0c97993f7b659474a5fd305921cdc5ereedvoid SampleWindow::toggleDistanceFieldFonts() {
17094302ae91b0c97993f7b659474a5fd305921cdc5ereed    SkSurfaceProps props = this->getSurfaceProps();
17104302ae91b0c97993f7b659474a5fd305921cdc5ereed    uint32_t flags = props.flags() ^ SkSurfaceProps::kUseDistanceFieldFonts_Flag;
17114302ae91b0c97993f7b659474a5fd305921cdc5ereed    this->setSurfaceProps(SkSurfaceProps(flags, props.pixelGeometry()));
17124302ae91b0c97993f7b659474a5fd305921cdc5ereed
17134302ae91b0c97993f7b659474a5fd305921cdc5ereed    this->updateTitle();
17144302ae91b0c97993f7b659474a5fd305921cdc5ereed    this->inval(NULL);
17154302ae91b0c97993f7b659474a5fd305921cdc5ereed}
17164302ae91b0c97993f7b659474a5fd305921cdc5ereed
17178a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkDumpCanvas.h"
17188a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
17198a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.combool SampleWindow::onHandleKey(SkKey key) {
1720f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com    {
1721f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com        SkView* view = curr_view(this);
1722f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com        if (view) {
1723f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com            SkEvent evt(gKeyEvtName);
1724f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com            evt.setFast32(key);
1725f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com            if (view->doQuery(&evt)) {
1726f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com                return true;
1727f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com            }
1728f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com        }
1729f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com    }
17308a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    switch (key) {
17318a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        case kRight_SkKey:
17328a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            if (this->nextSample()) {
17338a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                return true;
17348a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            }
17358a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            break;
17368a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        case kLeft_SkKey:
1737e2dd973e4b0dac58610b73d577e91899c2b1c4eascroggo@google.com            if (this->previousSample()) {
1738e2dd973e4b0dac58610b73d577e91899c2b1c4eascroggo@google.com                return true;
1739e2dd973e4b0dac58610b73d577e91899c2b1c4eascroggo@google.com            }
17408a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            return true;
17418a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        case kUp_SkKey:
1742f7f79d2a6e669058ee9bb9fc4f0a9e998bfc5da6reed            this->changeZoomLevel(1.f / 32.f);
17438a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            return true;
17448a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        case kDown_SkKey:
1745f7f79d2a6e669058ee9bb9fc4f0a9e998bfc5da6reed            this->changeZoomLevel(-1.f / 32.f);
17468a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            return true;
17476f6e8c39a7b07f8a916a60ad27f17bd13f3c89admike@reedtribe.org        case kOK_SkKey: {
17486f6e8c39a7b07f8a916a60ad27f17bd13f3c89admike@reedtribe.org            SkString title;
17496f6e8c39a7b07f8a916a60ad27f17bd13f3c89admike@reedtribe.org            if (curr_title(this, &title)) {
17506f6e8c39a7b07f8a916a60ad27f17bd13f3c89admike@reedtribe.org                writeTitleToPrefs(title.c_str());
17518a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            }
17528a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            return true;
17536f6e8c39a7b07f8a916a60ad27f17bd13f3c89admike@reedtribe.org        }
175434245c7871f6339de8cc2be8fb1090ca3cba54efreed@android.com        case kBack_SkKey:
1755db03eaa37111a63835ab7f61cb550971e609a621yangsu@google.com            this->showOverview();
175634245c7871f6339de8cc2be8fb1090ca3cba54efreed@android.com            return true;
17578a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        default:
17588a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            break;
17598a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    }
17608a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    return this->INHERITED::onHandleKey(key);
17618a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
17628a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
176352f57e1d11a00bdc5efb96709446546cdbc1ff9dreed@google.com///////////////////////////////////////////////////////////////////////////////
176452f57e1d11a00bdc5efb96709446546cdbc1ff9dreed@google.com
176552f57e1d11a00bdc5efb96709446546cdbc1ff9dreed@google.comstatic const char gGestureClickType[] = "GestureClickType";
176652f57e1d11a00bdc5efb96709446546cdbc1ff9dreed@google.com
1767d3aed39ab1ad88b05b9423ee1329c227d1f8f612Scroggobool SampleWindow::onDispatchClick(int x, int y, Click::State state,
17684d5c26de0a24f86c37c1da8b0e30d11a550ea67breed@google.com        void* owner, unsigned modi) {
17690f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo    if (Click::kMoved_State == state) {
17700f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo        updatePointer(x, y);
17710f185c2709f638c0f4d452cb38b434cadfd15ab9Scroggo    }
1772e1ca705cac4b946993f6cbf798e2a0ba27e739f3reed@google.com    int w = SkScalarRoundToInt(this->width());
1773e1ca705cac4b946993f6cbf798e2a0ba27e739f3reed@google.com    int h = SkScalarRoundToInt(this->height());
1774dd0cd34067d103ace7c6739405cb7885d8ad3fb2mike@reedtribe.org
1775dd0cd34067d103ace7c6739405cb7885d8ad3fb2mike@reedtribe.org    // check for the resize-box
1776dd0cd34067d103ace7c6739405cb7885d8ad3fb2mike@reedtribe.org    if (w - x < 16 && h - y < 16) {
1777dd0cd34067d103ace7c6739405cb7885d8ad3fb2mike@reedtribe.org        return false;   // let the OS handle the click
17784605a3f3ff8fa2072f98e6bcb71bc43d4c6196d6chudy@google.com    }
1779db03eaa37111a63835ab7f61cb550971e609a621yangsu@google.com    else if (fMagnify) {
1780db03eaa37111a63835ab7f61cb550971e609a621yangsu@google.com        //it's only necessary to update the drawing if there's a click
1781db03eaa37111a63835ab7f61cb550971e609a621yangsu@google.com        this->inval(NULL);
1782db03eaa37111a63835ab7f61cb550971e609a621yangsu@google.com        return false; //prevent dragging while magnify is enabled
17834d5c26de0a24f86c37c1da8b0e30d11a550ea67breed@google.com    } else {
17844d5c26de0a24f86c37c1da8b0e30d11a550ea67breed@google.com        // capture control+option, and trigger debugger
17854d5c26de0a24f86c37c1da8b0e30d11a550ea67breed@google.com        if ((modi & kControl_SkModifierKey) && (modi & kOption_SkModifierKey)) {
17864d5c26de0a24f86c37c1da8b0e30d11a550ea67breed@google.com            if (Click::kDown_State == state) {
17874d5c26de0a24f86c37c1da8b0e30d11a550ea67breed@google.com                SkEvent evt("debug-hit-test");
17884d5c26de0a24f86c37c1da8b0e30d11a550ea67breed@google.com                evt.setS32("debug-hit-test-x", x);
17894d5c26de0a24f86c37c1da8b0e30d11a550ea67breed@google.com                evt.setS32("debug-hit-test-y", y);
17904d5c26de0a24f86c37c1da8b0e30d11a550ea67breed@google.com                curr_view(this)->doEvent(evt);
17914d5c26de0a24f86c37c1da8b0e30d11a550ea67breed@google.com            }
17924d5c26de0a24f86c37c1da8b0e30d11a550ea67breed@google.com            return true;
17934d5c26de0a24f86c37c1da8b0e30d11a550ea67breed@google.com        } else {
17944d5c26de0a24f86c37c1da8b0e30d11a550ea67breed@google.com            return this->INHERITED::onDispatchClick(x, y, state, owner, modi);
17954d5c26de0a24f86c37c1da8b0e30d11a550ea67breed@google.com        }
1796dd0cd34067d103ace7c6739405cb7885d8ad3fb2mike@reedtribe.org    }
1797dd0cd34067d103ace7c6739405cb7885d8ad3fb2mike@reedtribe.org}
1798dd0cd34067d103ace7c6739405cb7885d8ad3fb2mike@reedtribe.org
179952f57e1d11a00bdc5efb96709446546cdbc1ff9dreed@google.comclass GestureClick : public SkView::Click {
180052f57e1d11a00bdc5efb96709446546cdbc1ff9dreed@google.compublic:
180152f57e1d11a00bdc5efb96709446546cdbc1ff9dreed@google.com    GestureClick(SkView* target) : SkView::Click(target) {
180252f57e1d11a00bdc5efb96709446546cdbc1ff9dreed@google.com        this->setType(gGestureClickType);
180352f57e1d11a00bdc5efb96709446546cdbc1ff9dreed@google.com    }
180452f57e1d11a00bdc5efb96709446546cdbc1ff9dreed@google.com
180552f57e1d11a00bdc5efb96709446546cdbc1ff9dreed@google.com    static bool IsGesture(Click* click) {
180652f57e1d11a00bdc5efb96709446546cdbc1ff9dreed@google.com        return click->isType(gGestureClickType);
180752f57e1d11a00bdc5efb96709446546cdbc1ff9dreed@google.com    }
180852f57e1d11a00bdc5efb96709446546cdbc1ff9dreed@google.com};
180952f57e1d11a00bdc5efb96709446546cdbc1ff9dreed@google.com
18104d5c26de0a24f86c37c1da8b0e30d11a550ea67breed@google.comSkView::Click* SampleWindow::onFindClickHandler(SkScalar x, SkScalar y,
18114d5c26de0a24f86c37c1da8b0e30d11a550ea67breed@google.com                                                unsigned modi) {
181252f57e1d11a00bdc5efb96709446546cdbc1ff9dreed@google.com    return new GestureClick(this);
181352f57e1d11a00bdc5efb96709446546cdbc1ff9dreed@google.com}
181452f57e1d11a00bdc5efb96709446546cdbc1ff9dreed@google.com
181552f57e1d11a00bdc5efb96709446546cdbc1ff9dreed@google.combool SampleWindow::onClick(Click* click) {
181652f57e1d11a00bdc5efb96709446546cdbc1ff9dreed@google.com    if (GestureClick::IsGesture(click)) {
18174d4f281b28c3db0513ea1a68db4577e2518002b3bsalomon@google.com        float x = static_cast<float>(click->fICurr.fX);
18184d4f281b28c3db0513ea1a68db4577e2518002b3bsalomon@google.com        float y = static_cast<float>(click->fICurr.fY);
18194605a3f3ff8fa2072f98e6bcb71bc43d4c6196d6chudy@google.com
182052f57e1d11a00bdc5efb96709446546cdbc1ff9dreed@google.com        switch (click->fState) {
182152f57e1d11a00bdc5efb96709446546cdbc1ff9dreed@google.com            case SkView::Click::kDown_State:
1822d3aed39ab1ad88b05b9423ee1329c227d1f8f612Scroggo                fGesture.touchBegin(click->fOwner, x, y);
182352f57e1d11a00bdc5efb96709446546cdbc1ff9dreed@google.com                break;
182452f57e1d11a00bdc5efb96709446546cdbc1ff9dreed@google.com            case SkView::Click::kMoved_State:
1825d3aed39ab1ad88b05b9423ee1329c227d1f8f612Scroggo                fGesture.touchMoved(click->fOwner, x, y);
1826f03bb566e25ace918f8fdda3cb8426626a00894creed@google.com                this->updateMatrix();
182752f57e1d11a00bdc5efb96709446546cdbc1ff9dreed@google.com                break;
182852f57e1d11a00bdc5efb96709446546cdbc1ff9dreed@google.com            case SkView::Click::kUp_State:
1829d3aed39ab1ad88b05b9423ee1329c227d1f8f612Scroggo                fGesture.touchEnd(click->fOwner);
1830f03bb566e25ace918f8fdda3cb8426626a00894creed@google.com                this->updateMatrix();
183152f57e1d11a00bdc5efb96709446546cdbc1ff9dreed@google.com                break;
183252f57e1d11a00bdc5efb96709446546cdbc1ff9dreed@google.com        }
183352f57e1d11a00bdc5efb96709446546cdbc1ff9dreed@google.com        return true;
183452f57e1d11a00bdc5efb96709446546cdbc1ff9dreed@google.com    }
183552f57e1d11a00bdc5efb96709446546cdbc1ff9dreed@google.com    return false;
183652f57e1d11a00bdc5efb96709446546cdbc1ff9dreed@google.com}
183752f57e1d11a00bdc5efb96709446546cdbc1ff9dreed@google.com
183852f57e1d11a00bdc5efb96709446546cdbc1ff9dreed@google.com///////////////////////////////////////////////////////////////////////////////
183952f57e1d11a00bdc5efb96709446546cdbc1ff9dreed@google.com
18408a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comvoid SampleWindow::loadView(SkView* view) {
18418a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkView::F2BIter iter(this);
18428a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkView* prev = iter.next();
18438a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    if (prev) {
18448a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        prev->detachFromParent();
18458a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    }
18464605a3f3ff8fa2072f98e6bcb71bc43d4c6196d6chudy@google.com
18478a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    view->setVisibleP(true);
1848f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com    view->setClipToBounds(false);
18498a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    this->attachChildToFront(view)->unref();
18508a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    view->setSize(this->width(), this->height());
18518a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1852921091f29e2ecfec55f4d1ac5611b4aa4731e7d6yangsu@google.com    //repopulate the slide menu when a view is loaded
18537dadc748d96fdf6c1eadc960f1481807d2ac90cfscroggo@google.com    fSlideMenu->reset();
1854388974f1dd4d7f1a202aac8a007dc2a4eaf051cbdjsollen@google.com
1855b073d920c90bc95f6c216327acd321a4fc809bfascroggo@google.com    (void)SampleView::SetUsePipe(view, fPipeState);
1856bbe43a9ce0513d37cbd5dca583c391b7b1e39b3acommit-bot@chromium.org    if (SampleView::IsSampleView(view)) {
1857bbe43a9ce0513d37cbd5dca583c391b7b1e39b3acommit-bot@chromium.org        SampleView* sampleView = (SampleView*)view;
1858bbe43a9ce0513d37cbd5dca583c391b7b1e39b3acommit-bot@chromium.org        sampleView->requestMenu(fSlideMenu);
1859bbe43a9ce0513d37cbd5dca583c391b7b1e39b3acommit-bot@chromium.org        sampleView->onTileSizeChanged(this->tileSize());
1860bbe43a9ce0513d37cbd5dca583c391b7b1e39b3acommit-bot@chromium.org    }
18617dadc748d96fdf6c1eadc960f1481807d2ac90cfscroggo@google.com    this->onUpdateMenu(fSlideMenu);
18628a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    this->updateTitle();
18638a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
18648a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1865098e96df6ab0327f18537c7006ff2b0b4116ee30bsalomon@google.comstatic const char* gDeviceTypePrefix[] = {
18668a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    "raster: ",
18678a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    "picture: ",
1868cf8fb1f6f03fc77f9927564f9ef9abeeeec508d2bsalomon@google.com#if SK_SUPPORT_GPU
186974913722bfe5e4b6810545891958e3d8e9c63791bsalomon@google.com    "opengl: ",
1870b442a6d5726569364e15c3056bbfb59b9b6e38cerobertphillips@google.com#if SK_ANGLE
1871b442a6d5726569364e15c3056bbfb59b9b6e38cerobertphillips@google.com    "angle: ",
1872cf8fb1f6f03fc77f9927564f9ef9abeeeec508d2bsalomon@google.com#endif // SK_ANGLE
1873cf8fb1f6f03fc77f9927564f9ef9abeeeec508d2bsalomon@google.com#endif // SK_SUPPORT_GPU
1874beedb81a7fa9bd1274d64b2c000ef6ee23c9a810reed    "deferred: ",
18758a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com};
1876cf8fb1f6f03fc77f9927564f9ef9abeeeec508d2bsalomon@google.comSK_COMPILE_ASSERT(SK_ARRAY_COUNT(gDeviceTypePrefix) == SampleWindow::kDeviceTypeCnt,
1877cf8fb1f6f03fc77f9927564f9ef9abeeeec508d2bsalomon@google.com                  array_size_mismatch);
18788a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1879db03eaa37111a63835ab7f61cb550971e609a621yangsu@google.comstatic const char* trystate_str(SkOSMenu::TriState state,
1880569e0435af62bdb88a662fa0592f75673a17afd9reed@google.com                                const char trueStr[], const char falseStr[]) {
1881db03eaa37111a63835ab7f61cb550971e609a621yangsu@google.com    if (SkOSMenu::kOnState == state) {
1882569e0435af62bdb88a662fa0592f75673a17afd9reed@google.com        return trueStr;
1883db03eaa37111a63835ab7f61cb550971e609a621yangsu@google.com    } else if (SkOSMenu::kOffState == state) {
1884569e0435af62bdb88a662fa0592f75673a17afd9reed@google.com        return falseStr;
1885569e0435af62bdb88a662fa0592f75673a17afd9reed@google.com    }
1886569e0435af62bdb88a662fa0592f75673a17afd9reed@google.com    return NULL;
1887569e0435af62bdb88a662fa0592f75673a17afd9reed@google.com}
1888569e0435af62bdb88a662fa0592f75673a17afd9reed@google.com
1889ddb5eca198736a320b8318eb5f6dfd6d0b6ad1d3reedbool SampleWindow::getRawTitle(SkString* title) {
1890ddb5eca198736a320b8318eb5f6dfd6d0b6ad1d3reed    return curr_title(this, title);
1891ddb5eca198736a320b8318eb5f6dfd6d0b6ad1d3reed}
18928a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1893ddb5eca198736a320b8318eb5f6dfd6d0b6ad1d3reedvoid SampleWindow::updateTitle() {
18946f6e8c39a7b07f8a916a60ad27f17bd13f3c89admike@reedtribe.org    SkString title;
1895ddb5eca198736a320b8318eb5f6dfd6d0b6ad1d3reed    if (!this->getRawTitle(&title)) {
18968a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        title.set("<unknown>");
18978a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    }
18982e7b43d33cc495663cb814a7a9d1ecdc09c31828bsalomon@google.com
1899098e96df6ab0327f18537c7006ff2b0b4116ee30bsalomon@google.com    title.prepend(gDeviceTypePrefix[fDeviceType]);
19008a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
19018a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    title.prepend(" ");
1902c3b3266b7db2f1a41d41ecac010c766b7ad8eebcreed    title.prepend(sk_tool_utils::colortype_name(this->getBitmap().colorType()));
19032e7b43d33cc495663cb814a7a9d1ecdc09c31828bsalomon@google.com
1904cc63b32eb8702bfa4d965fa443cf00fc1c1d10b7commit-bot@chromium.org    if (fTilingMode != kNo_Tiling) {
1905cc63b32eb8702bfa4d965fa443cf00fc1c1d10b7commit-bot@chromium.org        title.prependf("<T: %s> ", gTilingInfo[fTilingMode].label);
1906cc63b32eb8702bfa4d965fa443cf00fc1c1d10b7commit-bot@chromium.org    }
19078a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    if (fAnimating) {
19088a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        title.prepend("<A> ");
19098a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    }
19106c5f6f25b43f1210decb48956c1a2fbe5b58f889reed@android.com    if (fRotate) {
19116c5f6f25b43f1210decb48956c1a2fbe5b58f889reed@android.com        title.prepend("<R> ");
19126c5f6f25b43f1210decb48956c1a2fbe5b58f889reed@android.com    }
1913e8f091093509d946a7f6722b40033a3dc946dc0fbsalomon@google.com    if (fPerspAnim) {
1914e8f091093509d946a7f6722b40033a3dc946dc0fbsalomon@google.com        title.prepend("<K> ");
1915e8f091093509d946a7f6722b40033a3dc946dc0fbsalomon@google.com    }
19164302ae91b0c97993f7b659474a5fd305921cdc5ereed    if (this->getSurfaceProps().flags() & SkSurfaceProps::kUseDistanceFieldFonts_Flag) {
19174302ae91b0c97993f7b659474a5fd305921cdc5ereed        title.prepend("<DFF> ");
19184302ae91b0c97993f7b659474a5fd305921cdc5ereed    }
1919569e0435af62bdb88a662fa0592f75673a17afd9reed@google.com
1920569e0435af62bdb88a662fa0592f75673a17afd9reed@google.com    title.prepend(trystate_str(fLCDState, "LCD ", "lcd "));
1921569e0435af62bdb88a662fa0592f75673a17afd9reed@google.com    title.prepend(trystate_str(fAAState, "AA ", "aa "));
192293a1215fe0ab007ce941c721f1fd3e9dcb5d4754reed    title.prepend(gFilterQualityStates[fFilterQualityIndex].fLabel);
192396aabc850835f6d08a117c0277be93848ddbf785bungeman@google.com    title.prepend(trystate_str(fSubpixelState, "S ", "s "));
1924569e0435af62bdb88a662fa0592f75673a17afd9reed@google.com    title.prepend(fFlipAxis & kFlipAxis_X ? "X " : NULL);
1925569e0435af62bdb88a662fa0592f75673a17afd9reed@google.com    title.prepend(fFlipAxis & kFlipAxis_Y ? "Y " : NULL);
192696aabc850835f6d08a117c0277be93848ddbf785bungeman@google.com    title.prepend(gHintingStates[fHintingState].label);
1927dd0cd34067d103ace7c6739405cb7885d8ad3fb2mike@reedtribe.org
1928dd0cd34067d103ace7c6739405cb7885d8ad3fb2mike@reedtribe.org    if (fZoomLevel) {
1929e32b5837c3f35b80502759f3de3e8cadf6625f4edjsollen@google.com        title.prependf("{%.2f} ", SkScalarToFloat(fZoomLevel));
1930dd0cd34067d103ace7c6739405cb7885d8ad3fb2mike@reedtribe.org    }
19314605a3f3ff8fa2072f98e6bcb71bc43d4c6196d6chudy@google.com
19322eb595292b9624371d1698ae9da7accb4c09c26cmike@reedtribe.org    if (fMeasureFPS) {
193343e10145911bde6ac8c3f14fd46611a13c76f8b9reed@google.com        title.appendf(" %8.3f ms", fMeasureFPS_Time / (float)FPS_REPEAT_COUNT);
19342eb595292b9624371d1698ae9da7accb4c09c26cmike@reedtribe.org    }
1935ddb5eca198736a320b8318eb5f6dfd6d0b6ad1d3reed
1936ddb5eca198736a320b8318eb5f6dfd6d0b6ad1d3reed    SkView* view = curr_view(this);
1937a6ff4dc22d5006dc588769aa20c8b0bb4fde6d43reed@google.com    if (SampleView::IsSampleView(view)) {
1938b073d920c90bc95f6c216327acd321a4fc809bfascroggo@google.com        switch (fPipeState) {
1939b073d920c90bc95f6c216327acd321a4fc809bfascroggo@google.com            case SkOSMenu::kOnState:
1940b073d920c90bc95f6c216327acd321a4fc809bfascroggo@google.com                title.prepend("<Pipe> ");
1941b073d920c90bc95f6c216327acd321a4fc809bfascroggo@google.com                break;
1942b073d920c90bc95f6c216327acd321a4fc809bfascroggo@google.com            case SkOSMenu::kMixedState:
1943b073d920c90bc95f6c216327acd321a4fc809bfascroggo@google.com                title.prepend("<Tiled Pipe> ");
1944b073d920c90bc95f6c216327acd321a4fc809bfascroggo@google.com                break;
19454605a3f3ff8fa2072f98e6bcb71bc43d4c6196d6chudy@google.com
1946b073d920c90bc95f6c216327acd321a4fc809bfascroggo@google.com            default:
1947b073d920c90bc95f6c216327acd321a4fc809bfascroggo@google.com                break;
1948b073d920c90bc95f6c216327acd321a4fc809bfascroggo@google.com        }
1949a6ff4dc22d5006dc588769aa20c8b0bb4fde6d43reed@google.com        title.prepend("! ");
1950a6ff4dc22d5006dc588769aa20c8b0bb4fde6d43reed@google.com    }
19512eb595292b9624371d1698ae9da7accb4c09c26cmike@reedtribe.org
1952cf8fb1f6f03fc77f9927564f9ef9abeeeec508d2bsalomon@google.com#if SK_SUPPORT_GPU
195382502e2e3966a9b0e48665f20154eaacd2a452b3bsalomon@google.com    if (IsGpuDeviceType(fDeviceType) &&
195449f085dddff10473b6ebf832a974288300224e60bsalomon        fDevManager &&
195582502e2e3966a9b0e48665f20154eaacd2a452b3bsalomon@google.com        fDevManager->getGrRenderTarget() &&
19561195925b05ee9d666ea8a8f68fde5d8ca7e49b04bsalomon@google.com        fDevManager->getGrRenderTarget()->numSamples() > 0) {
19571195925b05ee9d666ea8a8f68fde5d8ca7e49b04bsalomon@google.com        title.appendf(" [MSAA: %d]",
19581195925b05ee9d666ea8a8f68fde5d8ca7e49b04bsalomon@google.com                       fDevManager->getGrRenderTarget()->numSamples());
19591195925b05ee9d666ea8a8f68fde5d8ca7e49b04bsalomon@google.com    }
1960cf8fb1f6f03fc77f9927564f9ef9abeeeec508d2bsalomon@google.com#endif
19611195925b05ee9d666ea8a8f68fde5d8ca7e49b04bsalomon@google.com
19628a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    this->setTitle(title.c_str());
19638a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
19648a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
19658a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comvoid SampleWindow::onSizeChange() {
19668a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    this->INHERITED::onSizeChange();
19674605a3f3ff8fa2072f98e6bcb71bc43d4c6196d6chudy@google.com
19688a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkView::F2BIter iter(this);
19698a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkView* view = iter.next();
19708a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    view->setSize(this->width(), this->height());
19712e7b43d33cc495663cb814a7a9d1ecdc09c31828bsalomon@google.com
19728a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    // rebuild our clippath
19738a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    {
19748a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        const SkScalar W = this->width();
19758a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        const SkScalar H = this->height();
19762e7b43d33cc495663cb814a7a9d1ecdc09c31828bsalomon@google.com
19778a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        fClipPath.reset();
19788a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#if 0
19798a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        for (SkScalar y = SK_Scalar1; y < H; y += SkIntToScalar(32)) {
19808a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            SkRect r;
19818a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            r.set(SK_Scalar1, y, SkIntToScalar(30), y + SkIntToScalar(30));
19828a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            for (; r.fLeft < W; r.offset(SkIntToScalar(32), 0))
19838a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                fClipPath.addRect(r);
19848a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        }
19858a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#else
19868a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        SkRect r;
19878a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        r.set(0, 0, W, H);
19888a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        fClipPath.addRect(r, SkPath::kCCW_Direction);
19898a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        r.set(W/4, H/4, W*3/4, H*3/4);
19908a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        fClipPath.addRect(r, SkPath::kCW_Direction);
19918a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#endif
19928a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    }
19932e7b43d33cc495663cb814a7a9d1ecdc09c31828bsalomon@google.com
19942c8208f3a444098aee562f5a1ef620142807eda2Scroggo    fZoomCenterX = SkScalarHalf(this->width());
19952c8208f3a444098aee562f5a1ef620142807eda2Scroggo    fZoomCenterY = SkScalarHalf(this->height());
19962c8208f3a444098aee562f5a1ef620142807eda2Scroggo
199756c69773aea56c6c6bd47bc7e7970dd081205184djsollen@google.com#ifdef SK_BUILD_FOR_ANDROID
1998b4490c7435df46261c00dbfdcdd9d2e9d56d1f52Scroggo    // FIXME: The first draw after a size change does not work on Android, so
1999b4490c7435df46261c00dbfdcdd9d2e9d56d1f52Scroggo    // we post an invalidate.
200062b65b0913566381db468277de07e5dd2a9237caScroggo    this->postInvalDelay();
2001716a0387ca197ca728ba691f3d812d4252c0f10bScroggo#endif
20028a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    this->updateTitle();    // to refresh our config
2003098e96df6ab0327f18537c7006ff2b0b4116ee30bsalomon@google.com    fDevManager->windowSizeChanged(this);
2004bbe43a9ce0513d37cbd5dca583c391b7b1e39b3acommit-bot@chromium.org
2005bbe43a9ce0513d37cbd5dca583c391b7b1e39b3acommit-bot@chromium.org    if (fTilingMode != kNo_Tiling && SampleView::IsSampleView(view)) {
2006bbe43a9ce0513d37cbd5dca583c391b7b1e39b3acommit-bot@chromium.org        ((SampleView*)view)->onTileSizeChanged(this->tileSize());
2007bbe43a9ce0513d37cbd5dca583c391b7b1e39b3acommit-bot@chromium.org    }
20088a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
20098a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
20108a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com///////////////////////////////////////////////////////////////////////////////
20118a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
2012a6ff4dc22d5006dc588769aa20c8b0bb4fde6d43reed@google.comstatic const char is_sample_view_tag[] = "sample-is-sample-view";
20132eb595292b9624371d1698ae9da7accb4c09c26cmike@reedtribe.orgstatic const char repeat_count_tag[] = "sample-set-repeat-count";
20140faac1e8579088a39f38d02ff675f14d7deb608dreed@google.comstatic const char set_use_pipe_tag[] = "sample-set-use-pipe";
20152eb595292b9624371d1698ae9da7accb4c09c26cmike@reedtribe.org
2016a6ff4dc22d5006dc588769aa20c8b0bb4fde6d43reed@google.combool SampleView::IsSampleView(SkView* view) {
2017a6ff4dc22d5006dc588769aa20c8b0bb4fde6d43reed@google.com    SkEvent evt(is_sample_view_tag);
2018a6ff4dc22d5006dc588769aa20c8b0bb4fde6d43reed@google.com    return view->doQuery(&evt);
2019a6ff4dc22d5006dc588769aa20c8b0bb4fde6d43reed@google.com}
2020a6ff4dc22d5006dc588769aa20c8b0bb4fde6d43reed@google.com
2021f21833999d90ad9c8c584cff3238797b39cfc00breed@google.combool SampleView::SetRepeatDraw(SkView* view, int count) {
20222eb595292b9624371d1698ae9da7accb4c09c26cmike@reedtribe.org    SkEvent evt(repeat_count_tag);
20232eb595292b9624371d1698ae9da7accb4c09c26cmike@reedtribe.org    evt.setFast32(count);
2024f21833999d90ad9c8c584cff3238797b39cfc00breed@google.com    return view->doEvent(evt);
20252eb595292b9624371d1698ae9da7accb4c09c26cmike@reedtribe.org}
20262eb595292b9624371d1698ae9da7accb4c09c26cmike@reedtribe.org
2027b073d920c90bc95f6c216327acd321a4fc809bfascroggo@google.combool SampleView::SetUsePipe(SkView* view, SkOSMenu::TriState state) {
2028b073d920c90bc95f6c216327acd321a4fc809bfascroggo@google.com    SkEvent evt;
2029b073d920c90bc95f6c216327acd321a4fc809bfascroggo@google.com    evt.setS32(set_use_pipe_tag, state);
20300faac1e8579088a39f38d02ff675f14d7deb608dreed@google.com    return view->doEvent(evt);
20310faac1e8579088a39f38d02ff675f14d7deb608dreed@google.com}
20320faac1e8579088a39f38d02ff675f14d7deb608dreed@google.com
20332eb595292b9624371d1698ae9da7accb4c09c26cmike@reedtribe.orgbool SampleView::onEvent(const SkEvent& evt) {
20342eb595292b9624371d1698ae9da7accb4c09c26cmike@reedtribe.org    if (evt.isType(repeat_count_tag)) {
20352eb595292b9624371d1698ae9da7accb4c09c26cmike@reedtribe.org        fRepeatCount = evt.getFast32();
20362eb595292b9624371d1698ae9da7accb4c09c26cmike@reedtribe.org        return true;
20372eb595292b9624371d1698ae9da7accb4c09c26cmike@reedtribe.org    }
20384d5c26de0a24f86c37c1da8b0e30d11a550ea67breed@google.com
2039b073d920c90bc95f6c216327acd321a4fc809bfascroggo@google.com    int32_t pipeHolder;
2040b073d920c90bc95f6c216327acd321a4fc809bfascroggo@google.com    if (evt.findS32(set_use_pipe_tag, &pipeHolder)) {
2041b073d920c90bc95f6c216327acd321a4fc809bfascroggo@google.com        fPipeState = static_cast<SkOSMenu::TriState>(pipeHolder);
20420faac1e8579088a39f38d02ff675f14d7deb608dreed@google.com        return true;
20430faac1e8579088a39f38d02ff675f14d7deb608dreed@google.com    }
20444d5c26de0a24f86c37c1da8b0e30d11a550ea67breed@google.com
20452eb595292b9624371d1698ae9da7accb4c09c26cmike@reedtribe.org    return this->INHERITED::onEvent(evt);
20462eb595292b9624371d1698ae9da7accb4c09c26cmike@reedtribe.org}
20472eb595292b9624371d1698ae9da7accb4c09c26cmike@reedtribe.org
20482eb595292b9624371d1698ae9da7accb4c09c26cmike@reedtribe.orgbool SampleView::onQuery(SkEvent* evt) {
2049a6ff4dc22d5006dc588769aa20c8b0bb4fde6d43reed@google.com    if (evt->isType(is_sample_view_tag)) {
2050a6ff4dc22d5006dc588769aa20c8b0bb4fde6d43reed@google.com        return true;
2051a6ff4dc22d5006dc588769aa20c8b0bb4fde6d43reed@google.com    }
20522eb595292b9624371d1698ae9da7accb4c09c26cmike@reedtribe.org    return this->INHERITED::onQuery(evt);
20532eb595292b9624371d1698ae9da7accb4c09c26cmike@reedtribe.org}
20542eb595292b9624371d1698ae9da7accb4c09c26cmike@reedtribe.org
205564e3eb24e52a84613ff8c1da5dac6f4b5ba38320reed@google.com
205664e3eb24e52a84613ff8c1da5dac6f4b5ba38320reed@google.comclass SimplePC : public SkGPipeController {
205764e3eb24e52a84613ff8c1da5dac6f4b5ba38320reed@google.compublic:
205864e3eb24e52a84613ff8c1da5dac6f4b5ba38320reed@google.com    SimplePC(SkCanvas* target);
205964e3eb24e52a84613ff8c1da5dac6f4b5ba38320reed@google.com    ~SimplePC();
20604605a3f3ff8fa2072f98e6bcb71bc43d4c6196d6chudy@google.com
206164e3eb24e52a84613ff8c1da5dac6f4b5ba38320reed@google.com    virtual void* requestBlock(size_t minRequest, size_t* actual);
206264e3eb24e52a84613ff8c1da5dac6f4b5ba38320reed@google.com    virtual void notifyWritten(size_t bytes);
206364e3eb24e52a84613ff8c1da5dac6f4b5ba38320reed@google.com
206464e3eb24e52a84613ff8c1da5dac6f4b5ba38320reed@google.comprivate:
2065961ddb04a0a7aba843032d829ab867518e52559ereed@google.com    SkGPipeReader   fReader;
2066961ddb04a0a7aba843032d829ab867518e52559ereed@google.com    void*           fBlock;
2067961ddb04a0a7aba843032d829ab867518e52559ereed@google.com    size_t          fBlockSize;
2068961ddb04a0a7aba843032d829ab867518e52559ereed@google.com    size_t          fBytesWritten;
2069961ddb04a0a7aba843032d829ab867518e52559ereed@google.com    int             fAtomsWritten;
207064e3eb24e52a84613ff8c1da5dac6f4b5ba38320reed@google.com    SkGPipeReader::Status   fStatus;
207164e3eb24e52a84613ff8c1da5dac6f4b5ba38320reed@google.com
207264e3eb24e52a84613ff8c1da5dac6f4b5ba38320reed@google.com    size_t        fTotalWritten;
207364e3eb24e52a84613ff8c1da5dac6f4b5ba38320reed@google.com};
207464e3eb24e52a84613ff8c1da5dac6f4b5ba38320reed@google.com
207564e3eb24e52a84613ff8c1da5dac6f4b5ba38320reed@google.comSimplePC::SimplePC(SkCanvas* target) : fReader(target) {
207664e3eb24e52a84613ff8c1da5dac6f4b5ba38320reed@google.com    fBlock = NULL;
207764e3eb24e52a84613ff8c1da5dac6f4b5ba38320reed@google.com    fBlockSize = fBytesWritten = 0;
207864e3eb24e52a84613ff8c1da5dac6f4b5ba38320reed@google.com    fStatus = SkGPipeReader::kDone_Status;
207964e3eb24e52a84613ff8c1da5dac6f4b5ba38320reed@google.com    fTotalWritten = 0;
2080961ddb04a0a7aba843032d829ab867518e52559ereed@google.com    fAtomsWritten = 0;
208174b7ffda687c66d46ac3cfa4f2baedd4c62e3fbescroggo@google.com    fReader.setBitmapDecoder(&SkImageDecoder::DecodeMemory);
208264e3eb24e52a84613ff8c1da5dac6f4b5ba38320reed@google.com}
208364e3eb24e52a84613ff8c1da5dac6f4b5ba38320reed@google.com
208464e3eb24e52a84613ff8c1da5dac6f4b5ba38320reed@google.comSimplePC::~SimplePC() {
208564e3eb24e52a84613ff8c1da5dac6f4b5ba38320reed@google.com//    SkASSERT(SkGPipeReader::kDone_Status == fStatus);
20860faac1e8579088a39f38d02ff675f14d7deb608dreed@google.com    if (fTotalWritten) {
2087b073d920c90bc95f6c216327acd321a4fc809bfascroggo@google.com        SkDebugf("--- %d bytes %d atoms, status %d\n", fTotalWritten,
2088b073d920c90bc95f6c216327acd321a4fc809bfascroggo@google.com                 fAtomsWritten, fStatus);
2089db03eaa37111a63835ab7f61cb550971e609a621yangsu@google.com#ifdef  PIPE_FILE
2090b073d920c90bc95f6c216327acd321a4fc809bfascroggo@google.com        //File is open in append mode
2091b073d920c90bc95f6c216327acd321a4fc809bfascroggo@google.com        FILE* f = fopen(FILE_PATH, "ab");
2092b073d920c90bc95f6c216327acd321a4fc809bfascroggo@google.com        SkASSERT(f != NULL);
2093b073d920c90bc95f6c216327acd321a4fc809bfascroggo@google.com        fwrite((const char*)fBlock + fBytesWritten, 1, bytes, f);
2094b073d920c90bc95f6c216327acd321a4fc809bfascroggo@google.com        fclose(f);
2095db03eaa37111a63835ab7f61cb550971e609a621yangsu@google.com#endif
2096db03eaa37111a63835ab7f61cb550971e609a621yangsu@google.com#ifdef PIPE_NET
2097b073d920c90bc95f6c216327acd321a4fc809bfascroggo@google.com        if (fAtomsWritten > 1 && fTotalWritten > 4) { //ignore done
2098b073d920c90bc95f6c216327acd321a4fc809bfascroggo@google.com            gServer.acceptConnections();
2099b073d920c90bc95f6c216327acd321a4fc809bfascroggo@google.com            gServer.writePacket(fBlock, fTotalWritten);
2100b073d920c90bc95f6c216327acd321a4fc809bfascroggo@google.com        }
2101db03eaa37111a63835ab7f61cb550971e609a621yangsu@google.com#endif
21020faac1e8579088a39f38d02ff675f14d7deb608dreed@google.com    }
2103db03eaa37111a63835ab7f61cb550971e609a621yangsu@google.com    sk_free(fBlock);
210464e3eb24e52a84613ff8c1da5dac6f4b5ba38320reed@google.com}
210564e3eb24e52a84613ff8c1da5dac6f4b5ba38320reed@google.com
210664e3eb24e52a84613ff8c1da5dac6f4b5ba38320reed@google.comvoid* SimplePC::requestBlock(size_t minRequest, size_t* actual) {
210764e3eb24e52a84613ff8c1da5dac6f4b5ba38320reed@google.com    sk_free(fBlock);
210864e3eb24e52a84613ff8c1da5dac6f4b5ba38320reed@google.com
210964e3eb24e52a84613ff8c1da5dac6f4b5ba38320reed@google.com    fBlockSize = minRequest * 4;
211064e3eb24e52a84613ff8c1da5dac6f4b5ba38320reed@google.com    fBlock = sk_malloc_throw(fBlockSize);
211164e3eb24e52a84613ff8c1da5dac6f4b5ba38320reed@google.com    fBytesWritten = 0;
211264e3eb24e52a84613ff8c1da5dac6f4b5ba38320reed@google.com    *actual = fBlockSize;
211364e3eb24e52a84613ff8c1da5dac6f4b5ba38320reed@google.com    return fBlock;
211464e3eb24e52a84613ff8c1da5dac6f4b5ba38320reed@google.com}
211564e3eb24e52a84613ff8c1da5dac6f4b5ba38320reed@google.com
211664e3eb24e52a84613ff8c1da5dac6f4b5ba38320reed@google.comvoid SimplePC::notifyWritten(size_t bytes) {
211764e3eb24e52a84613ff8c1da5dac6f4b5ba38320reed@google.com    SkASSERT(fBytesWritten + bytes <= fBlockSize);
211864e3eb24e52a84613ff8c1da5dac6f4b5ba38320reed@google.com    fStatus = fReader.playback((const char*)fBlock + fBytesWritten, bytes);
211964e3eb24e52a84613ff8c1da5dac6f4b5ba38320reed@google.com    SkASSERT(SkGPipeReader::kError_Status != fStatus);
212064e3eb24e52a84613ff8c1da5dac6f4b5ba38320reed@google.com    fBytesWritten += bytes;
212164e3eb24e52a84613ff8c1da5dac6f4b5ba38320reed@google.com    fTotalWritten += bytes;
21224605a3f3ff8fa2072f98e6bcb71bc43d4c6196d6chudy@google.com
2123961ddb04a0a7aba843032d829ab867518e52559ereed@google.com    fAtomsWritten += 1;
212464e3eb24e52a84613ff8c1da5dac6f4b5ba38320reed@google.com}
212564e3eb24e52a84613ff8c1da5dac6f4b5ba38320reed@google.com
2126db03eaa37111a63835ab7f61cb550971e609a621yangsu@google.comvoid SampleView::draw(SkCanvas* canvas) {
2127b073d920c90bc95f6c216327acd321a4fc809bfascroggo@google.com    if (SkOSMenu::kOffState == fPipeState) {
2128b073d920c90bc95f6c216327acd321a4fc809bfascroggo@google.com        this->INHERITED::draw(canvas);
2129b073d920c90bc95f6c216327acd321a4fc809bfascroggo@google.com    } else {
2130db03eaa37111a63835ab7f61cb550971e609a621yangsu@google.com        SkGPipeWriter writer;
2131db03eaa37111a63835ab7f61cb550971e609a621yangsu@google.com        SimplePC controller(canvas);
213252d9ac6c92ddf33b3b05eb77ba9509a7aa441657reed        SkBitmap bitmap = capture_bitmap(canvas);
213352d9ac6c92ddf33b3b05eb77ba9509a7aa441657reed        TiledPipeController tc(bitmap, &SkImageDecoder::DecodeMemory, &canvas->getTotalMatrix());
2134b073d920c90bc95f6c216327acd321a4fc809bfascroggo@google.com        SkGPipeController* pc;
2135b073d920c90bc95f6c216327acd321a4fc809bfascroggo@google.com        if (SkOSMenu::kMixedState == fPipeState) {
2136b073d920c90bc95f6c216327acd321a4fc809bfascroggo@google.com            pc = &tc;
2137b073d920c90bc95f6c216327acd321a4fc809bfascroggo@google.com        } else {
2138b073d920c90bc95f6c216327acd321a4fc809bfascroggo@google.com            pc = &controller;
2139b073d920c90bc95f6c216327acd321a4fc809bfascroggo@google.com        }
2140dde0956375e87027df2fdd80d430dd819c217aacreed@google.com        uint32_t flags = SkGPipeWriter::kCrossProcess_Flag;
21414605a3f3ff8fa2072f98e6bcb71bc43d4c6196d6chudy@google.com
2142b073d920c90bc95f6c216327acd321a4fc809bfascroggo@google.com        canvas = writer.startRecording(pc, flags);
2143db03eaa37111a63835ab7f61cb550971e609a621yangsu@google.com        //Must draw before controller goes out of scope and sends data
2144db03eaa37111a63835ab7f61cb550971e609a621yangsu@google.com        this->INHERITED::draw(canvas);
2145ef7bdfac618f60e9edc9f42cd4661d563937e6d8yangsu@google.com        //explicitly end recording to ensure writer is flushed before the memory
2146ef7bdfac618f60e9edc9f42cd4661d563937e6d8yangsu@google.com        //is freed in the deconstructor of the controller
2147ef7bdfac618f60e9edc9f42cd4661d563937e6d8yangsu@google.com        writer.endRecording();
21480faac1e8579088a39f38d02ff675f14d7deb608dreed@google.com    }
2149db03eaa37111a63835ab7f61cb550971e609a621yangsu@google.com}
21504d5c26de0a24f86c37c1da8b0e30d11a550ea67breed@google.com
2151db03eaa37111a63835ab7f61cb550971e609a621yangsu@google.comvoid SampleView::onDraw(SkCanvas* canvas) {
215263c684a8a609d39da11b4a656223cebf52ca85dccaryclark    if (!fHaveCalledOnceBeforeDraw) {
215363c684a8a609d39da11b4a656223cebf52ca85dccaryclark        fHaveCalledOnceBeforeDraw = true;
215463c684a8a609d39da11b4a656223cebf52ca85dccaryclark        this->onOnceBeforeDraw();
215563c684a8a609d39da11b4a656223cebf52ca85dccaryclark    }
215681e3d7f7943d5c257a07580b75218a5e256b0aadreed@google.com    this->onDrawBackground(canvas);
215781e3d7f7943d5c257a07580b75218a5e256b0aadreed@google.com
21582eb595292b9624371d1698ae9da7accb4c09c26cmike@reedtribe.org    for (int i = 0; i < fRepeatCount; i++) {
215985cade0a10217a50aebb495099ecc0435fe08b23scroggo@google.com        SkAutoCanvasRestore acr(canvas, true);
216085cade0a10217a50aebb495099ecc0435fe08b23scroggo@google.com        this->onDrawContent(canvas);
21612eb595292b9624371d1698ae9da7accb4c09c26cmike@reedtribe.org    }
21622eb595292b9624371d1698ae9da7accb4c09c26cmike@reedtribe.org}
21632eb595292b9624371d1698ae9da7accb4c09c26cmike@reedtribe.org
21642eb595292b9624371d1698ae9da7accb4c09c26cmike@reedtribe.orgvoid SampleView::onDrawBackground(SkCanvas* canvas) {
2165f21833999d90ad9c8c584cff3238797b39cfc00breed@google.com    canvas->drawColor(fBGColor);
21662eb595292b9624371d1698ae9da7accb4c09c26cmike@reedtribe.org}
21672eb595292b9624371d1698ae9da7accb4c09c26cmike@reedtribe.org
21682eb595292b9624371d1698ae9da7accb4c09c26cmike@reedtribe.org///////////////////////////////////////////////////////////////////////////////
21692eb595292b9624371d1698ae9da7accb4c09c26cmike@reedtribe.org
2170f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.comtemplate <typename T> void SkTBSort(T array[], int count) {
2171f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com    for (int i = 1; i < count - 1; i++) {
2172f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com        bool didSwap = false;
2173f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com        for (int j = count - 1; j > i; --j) {
2174f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com            if (array[j] < array[j-1]) {
2175f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com                T tmp(array[j-1]);
2176f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com                array[j-1] = array[j];
2177f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com                array[j] = tmp;
2178f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com                didSwap = true;
2179f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com            }
2180f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com        }
2181f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com        if (!didSwap) {
2182f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com            break;
2183f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com        }
2184f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com    }
21852e7b43d33cc495663cb814a7a9d1ecdc09c31828bsalomon@google.com
2186f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com    for (int k = 0; k < count - 1; k++) {
2187f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com        SkASSERT(!(array[k+1] < array[k]));
2188f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com    }
2189f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com}
2190f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com
2191f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com#include "SkRandom.h"
2192f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com
2193e0e7cfe44bb9d66d76120a79e5275c294bacaa22commit-bot@chromium.orgstatic void rand_rect(SkIRect* rect, SkRandom& rand) {
2194f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com    int bits = 8;
2195f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com    int shift = 32 - bits;
2196f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com    rect->set(rand.nextU() >> shift, rand.nextU() >> shift,
2197f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com              rand.nextU() >> shift, rand.nextU() >> shift);
2198f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com    rect->sort();
2199f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com}
2200f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com
2201f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.comstatic void dumpRect(const SkIRect& r) {
2202f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com    SkDebugf(" { %d, %d, %d, %d },\n",
2203f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com             r.fLeft, r.fTop,
2204f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com             r.fRight, r.fBottom);
2205f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com}
2206f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com
2207f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.comstatic void test_rects(const SkIRect rect[], int count) {
2208f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com    SkRegion rgn0, rgn1;
2209f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com
2210f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com    for (int i = 0; i < count; i++) {
2211f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com        rgn0.op(rect[i], SkRegion::kUnion_Op);
2212f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com     //   dumpRect(rect[i]);
2213f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com    }
2214f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com    rgn1.setRects(rect, count);
2215f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com
2216f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com    if (rgn0 != rgn1) {
2217f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com        SkDebugf("\n");
2218f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com        for (int i = 0; i < count; i++) {
2219f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com            dumpRect(rect[i]);
2220f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com        }
2221f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com        SkDebugf("\n");
2222f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com    }
2223f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com}
2224f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com
2225f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.comstatic void test() {
2226f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com    size_t i;
2227f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com
2228f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com    const SkIRect r0[] = {
2229f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com        { 0, 0, 1, 1 },
2230f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com        { 2, 2, 3, 3 },
2231f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com    };
2232f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com    const SkIRect r1[] = {
2233f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com        { 0, 0, 1, 3 },
2234f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com        { 1, 1, 2, 2 },
2235f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com        { 2, 0, 3, 3 },
2236f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com    };
2237f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com    const SkIRect r2[] = {
2238f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com        { 0, 0, 1, 2 },
2239f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com        { 2, 1, 3, 3 },
2240f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com        { 4, 0, 5, 1 },
2241f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com        { 6, 0, 7, 4 },
2242f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com    };
2243f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com
2244f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com    static const struct {
2245f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com        const SkIRect* fRects;
2246f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com        int            fCount;
2247f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com    } gRecs[] = {
2248f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com        { r0, SK_ARRAY_COUNT(r0) },
2249f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com        { r1, SK_ARRAY_COUNT(r1) },
2250f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com        { r2, SK_ARRAY_COUNT(r2) },
2251f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com    };
2252f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com
2253f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com    for (i = 0; i < SK_ARRAY_COUNT(gRecs); i++) {
2254f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com        test_rects(gRecs[i].fRects, gRecs[i].fCount);
2255f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com    }
22562e7b43d33cc495663cb814a7a9d1ecdc09c31828bsalomon@google.com
2257e0e7cfe44bb9d66d76120a79e5275c294bacaa22commit-bot@chromium.org    SkRandom rand;
2258f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com    for (i = 0; i < 10000; i++) {
2259f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com        SkRegion rgn0, rgn1;
2260f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com
2261f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com        const int N = 8;
2262f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com        SkIRect rect[N];
2263f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com        for (int j = 0; j < N; j++) {
2264f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com            rand_rect(&rect[j], rand);
2265f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com        }
2266f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com        test_rects(rect, N);
2267f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com    }
2268f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com}
2269f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com
227002939ce4bddd3223d9e8cc98d4abd02939b7f70acaryclark@google.com// FIXME: this should be in a header
227102939ce4bddd3223d9e8cc98d4abd02939b7f70acaryclark@google.comSkOSWindow* create_sk_window(void* hwnd, int argc, char** argv);
227278b8253c0a389a484e15439722e35a1658eb3b01senorblanco@chromium.orgSkOSWindow* create_sk_window(void* hwnd, int argc, char** argv) {
227302939ce4bddd3223d9e8cc98d4abd02939b7f70acaryclark@google.com    if (false) { // avoid bit rot, suppress warning
227402939ce4bddd3223d9e8cc98d4abd02939b7f70acaryclark@google.com        test();
227502939ce4bddd3223d9e8cc98d4abd02939b7f70acaryclark@google.com    }
2276098e96df6ab0327f18537c7006ff2b0b4116ee30bsalomon@google.com    return new SampleWindow(hwnd, argc, argv, NULL);
22778a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
22788a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
227902939ce4bddd3223d9e8cc98d4abd02939b7f70acaryclark@google.com// FIXME: this should be in a header
228002939ce4bddd3223d9e8cc98d4abd02939b7f70acaryclark@google.comvoid get_preferred_size(int* x, int* y, int* width, int* height);
22818a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comvoid get_preferred_size(int* x, int* y, int* width, int* height) {
22828a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    *x = 10;
22838a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    *y = 50;
22848a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    *width = 640;
22858a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    *height = 480;
22868a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
22878a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
22885987f58036574ccf23049b5fe71f29a441d0641dcaryclark@google.com#ifdef SK_BUILD_FOR_IOS
2289f0b1710bdb0c1a434228b5354d948fec696316acreed#include "SkApplication.h"
229017f0b6df7248b9bbdaddacc3a6c9c6efe4ae278ecaryclarkIOS_launch_type set_cmd_line_args(int , char *[], const char* resourceDir) {
2291f568f6a557dbc5a6b2f99b3747340ff7d36da26bcaryclark    SetResourcePath(resourceDir);
229217f0b6df7248b9bbdaddacc3a6c9c6efe4ae278ecaryclark    return kApplication__iOSLaunchType;
22935987f58036574ccf23049b5fe71f29a441d0641dcaryclark@google.com}
22945987f58036574ccf23049b5fe71f29a441d0641dcaryclark@google.com#endif
22955987f58036574ccf23049b5fe71f29a441d0641dcaryclark@google.com
22968a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comvoid application_init() {
22978a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com//    setenv("ANDROID_ROOT", "../../../data", 0);
2298e191b16fda2f5afea3a90653c1cd4f5a3c436e89reed@android.com#ifdef SK_BUILD_FOR_MAC
22998a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    setenv("ANDROID_ROOT", "/android/device/data", 0);
2300e191b16fda2f5afea3a90653c1cd4f5a3c436e89reed@android.com#endif
23012fbc7fa460c99bffa78b9afb9aaa4dc0db68e1babsalomon@google.com    SkGraphics::Init();
23022fbc7fa460c99bffa78b9afb9aaa4dc0db68e1babsalomon@google.com    SkEvent::Init();
23038a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
23048a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
23058a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comvoid application_term() {
23062fbc7fa460c99bffa78b9afb9aaa4dc0db68e1babsalomon@google.com    SkEvent::Term();
23072fbc7fa460c99bffa78b9afb9aaa4dc0db68e1babsalomon@google.com    SkGraphics::Term();
23088a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
2309