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 */ 7971d0c8049c6bfc7a58f0b41f8f59f9ec9ca077bbsalomon@google.com 857f7abc8659f17e58fc2d1410117033ad524f9d3epoger@google.com#include "SampleApp.h" 957f7abc8659f17e58fc2d1410117033ad524f9d3epoger@google.com 1057f7abc8659f17e58fc2d1410117033ad524f9d3epoger@google.com#include "OverView.h" 1157f7abc8659f17e58fc2d1410117033ad524f9d3epoger@google.com#include "Resources.h" 1257f7abc8659f17e58fc2d1410117033ad524f9d3epoger@google.com#include "SampleCode.h" 1357f7abc8659f17e58fc2d1410117033ad524f9d3epoger@google.com#include "SamplePipeControllers.h" 1457f7abc8659f17e58fc2d1410117033ad524f9d3epoger@google.com#include "SkCanvas.h" 1557f7abc8659f17e58fc2d1410117033ad524f9d3epoger@google.com#include "SkCommandLineFlags.h" 16b29c883fb46ac6099440d82ac57b86d25386daedbungeman@google.com#include "SkData.h" 176f6568b27eae62fea23ab8192c6da02ab892bb5eepoger@google.com#include "SkDevice.h" 1837269607334b99bf814c7dc6b426745d9b7c7e3fepoger@google.com#include "SkGPipe.h" 197bc13a62609149f0b535c2f3ff7210eb834d8b36epoger@google.com#include "SkGraphics.h" 205f6a00775511b5675607c2bfdbb096c0a815025depoger@google.com#include "SkImageEncoder.h" 21b9b9a18ab459c2616ac4a52c9f8cc0637d284229reed@android.com#include "SkOSFile.h" 22d9ba9a05d6f5766fdb1378b6ed84c0659009a8dascroggo@google.com#include "SkPDFDevice.h" 238a85d0c4938173476d037d7af0ee3b9436a1234ereed@google.com#include "SkPDFDocument.h" 244370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com#include "SkPaint.h" 25971d0c8049c6bfc7a58f0b41f8f59f9ec9ca077bbsalomon@google.com#include "SkPicture.h" 265e00989a283111cef05bed8102e45c16651e43e4commit-bot@chromium.org#include "SkPictureRecorder.h" 27de96163a80167636d95837f9ee6a2e98baf9d350epoger@google.com#include "SkStream.h" 28c41295d1223136da4f9e4c65b7145360684ede4bcommit-bot@chromium.org#include "SkSurface.h" 295af9b2032b552516c9223d9fb22185b022b13c62scroggo@google.com#include "SkTSort.h" 308015dd83ae37147bb630d4751030868051ad0caereed@android.com#include "SkTime.h" 318015dd83ae37147bb630d4751030868051ad0caereed@android.com#include "SkTypeface.h" 328015dd83ae37147bb630d4751030868051ad0caereed@android.com#include "SkWindow.h" 33e3bb3bce3e9c1f3bc8ee779b1b3383c18e560bcecommit-bot@chromium.org#include "TransitionView.h" 34e8ebeb1f8fde6525bbab988c6090a5d3ab19855bepoger@google.com#include "sk_tool_utils.h" 350dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org 369875dd14af6d768da8d1a4be58b98fc91ceca0ddtomhudson@google.com#if SK_SUPPORT_GPU 37770963f23f4fc313db0fa3bac18b1b8aafb55f17robertphillips@google.com#include "gl/GrGLInterface.h" 38977b9c8af3ef1b9a2fa2a0037cf3734cf2ba13d9robertphillips@google.com#include "gl/GrGLUtil.h" 395e00989a283111cef05bed8102e45c16651e43e4commit-bot@chromium.org#include "GrRenderTarget.h" 4072c9672ce274a3b6cb40800d66374edf25b157a3scroggo@google.com#include "GrContext.h" 41f711f320a34216fc9f64839b90b99a1492c54e09epoger@google.com#include "SkGpuDevice.h" 4211db6fa9b9fc30b1f504d9f53e0f6ae7149cc5c5reed@google.com#else 432a48c3adb7cf4fc754f99a41352210b4a99edf04bsalomon@google.comclass GrContext; 44310478e72c63e639373465216271b81f1e4a9136epoger@google.com#endif 4572c9672ce274a3b6cb40800d66374edf25b157a3scroggo@google.com 460770044da6d61dcbc8d9673fed8dd92460faa314reed@google.comextern SampleView* CreateSamplePictFileView(const char filename[]); 47515dcd36032997ce335daa0163c6d67e851bcad1commit-bot@chromium.org 48515dcd36032997ce335daa0163c6d67e851bcad1commit-bot@chromium.orgclass PictFileFactory : public SkViewFactory { 498065ec50f1937c1562810bfe2b216abfb98362b3commit-bot@chromium.org SkString fFilename; 50515dcd36032997ce335daa0163c6d67e851bcad1commit-bot@chromium.orgpublic: 51515dcd36032997ce335daa0163c6d67e851bcad1commit-bot@chromium.org PictFileFactory(const SkString& filename) : fFilename(filename) {} 52515dcd36032997ce335daa0163c6d67e851bcad1commit-bot@chromium.org virtual SkView* operator() () const SK_OVERRIDE { 53515dcd36032997ce335daa0163c6d67e851bcad1commit-bot@chromium.org return CreateSamplePictFileView(fFilename.c_str()); 54ed5eb4ef2aa1d6c705bc3ed466f9caba2a230a2bepoger@google.com } 55ed5eb4ef2aa1d6c705bc3ed466f9caba2a230a2bepoger@google.com}; 56cf8fb1f6f03fc77f9927564f9ef9abeeeec508d2bsalomon@google.com 57cf8fb1f6f03fc77f9927564f9ef9abeeeec508d2bsalomon@google.com#ifdef SAMPLE_PDF_FILE_VIEWER 58cf8fb1f6f03fc77f9927564f9ef9abeeeec508d2bsalomon@google.comextern SampleView* CreateSamplePdfFileViewer(const char filename[]); 59cf8fb1f6f03fc77f9927564f9ef9abeeeec508d2bsalomon@google.com 606f6568b27eae62fea23ab8192c6da02ab892bb5eepoger@google.comclass PdfFileViewerFactory : public SkViewFactory { 616f6568b27eae62fea23ab8192c6da02ab892bb5eepoger@google.com SkString fFilename; 626f6568b27eae62fea23ab8192c6da02ab892bb5eepoger@google.compublic: 63cf8fb1f6f03fc77f9927564f9ef9abeeeec508d2bsalomon@google.com PdfFileViewerFactory(const SkString& filename) : fFilename(filename) {} 6480724dfeb320d1152128cd33636c9024952432d3epoger@google.com virtual SkView* operator() () const SK_OVERRIDE { 65cf8fb1f6f03fc77f9927564f9ef9abeeeec508d2bsalomon@google.com return CreateSamplePdfFileViewer(fFilename.c_str()); 66123ac1d4eab757052407064623643fdc59f85363bsalomon@google.com } 67cf8fb1f6f03fc77f9927564f9ef9abeeeec508d2bsalomon@google.com}; 68cf8fb1f6f03fc77f9927564f9ef9abeeeec508d2bsalomon@google.com#endif // SAMPLE_PDF_FILE_VIEWER 69cf8fb1f6f03fc77f9927564f9ef9abeeeec508d2bsalomon@google.com 7076c913db20de7ae1baa49ae66e943bf7f40781ccepoger@google.com#define PIPE_FILEx 7176c913db20de7ae1baa49ae66e943bf7f40781ccepoger@google.com#ifdef PIPE_FILE 725e00989a283111cef05bed8102e45c16651e43e4commit-bot@chromium.org#define FILE_PATH "/path/to/drawing.data" 738923c6cfd580ac9accb11b909fa2a033d69553aareed@google.com#endif 740770044da6d61dcbc8d9673fed8dd92460faa314reed@google.com 759875dd14af6d768da8d1a4be58b98fc91ceca0ddtomhudson@google.com#define PIPE_NETx 769875dd14af6d768da8d1a4be58b98fc91ceca0ddtomhudson@google.com#ifdef PIPE_NET 770770044da6d61dcbc8d9673fed8dd92460faa314reed@google.com#include "SkSockets.h" 7800dae86f5872b60927b28a32b375bc01cd7c61c9reed@android.comSkTCPServer gServer; 79e3cc2eb88fef9b2123c6ea2ed813ce53b6385926epoger@google.com#endif 80e3cc2eb88fef9b2123c6ea2ed813ce53b6385926epoger@google.com 81e3cc2eb88fef9b2123c6ea2ed813ce53b6385926epoger@google.com#define USE_ARROWS_FOR_ZOOM true 82b29c883fb46ac6099440d82ac57b86d25386daedbungeman@google.com 83b29c883fb46ac6099440d82ac57b86d25386daedbungeman@google.com#if SK_ANGLE 84b29c883fb46ac6099440d82ac57b86d25386daedbungeman@google.com//#define DEFAULT_TO_ANGLE 1 85b29c883fb46ac6099440d82ac57b86d25386daedbungeman@google.com#else 8646cce91f4859b9c229938d4d649870c0a43b1806reed@google.com#define DEFAULT_TO_GPU 0 // if 1 default rendering is on GPU 8746cce91f4859b9c229938d4d649870c0a43b1806reed@google.com#endif 8846cce91f4859b9c229938d4d649870c0a43b1806reed@google.com 8946cce91f4859b9c229938d4d649870c0a43b1806reed@google.com#define ANIMATING_EVENTTYPE "nextSample" 9000dae86f5872b60927b28a32b375bc01cd7c61c9reed@android.com#define ANIMATING_DELAY 250 9100dae86f5872b60927b28a32b375bc01cd7c61c9reed@android.com 9200dae86f5872b60927b28a32b375bc01cd7c61c9reed@android.com#ifdef SK_DEBUG 9300dae86f5872b60927b28a32b375bc01cd7c61c9reed@android.com #define FPS_REPEAT_MULTIPLIER 1 9400dae86f5872b60927b28a32b375bc01cd7c61c9reed@android.com#else 953914958a49ee089ddeb04acc16373aae8bc2eaf7bsalomon@google.com #define FPS_REPEAT_MULTIPLIER 10 963914958a49ee089ddeb04acc16373aae8bc2eaf7bsalomon@google.com#endif 973914958a49ee089ddeb04acc16373aae8bc2eaf7bsalomon@google.com#define FPS_REPEAT_COUNT (10 * FPS_REPEAT_MULTIPLIER) 983914958a49ee089ddeb04acc16373aae8bc2eaf7bsalomon@google.com 99dd0ac281e920b01a63789893cc3e7422789658ddreed@android.comstatic SampleWindow* gSampleWindow; 10000dae86f5872b60927b28a32b375bc01cd7c61c9reed@android.com 101d4dfd10bb6f9bf3ac6e1ebc9bc3ae22c6d06321freed@google.comstatic bool gShowGMBounds; 102dd0ac281e920b01a63789893cc3e7422789658ddreed@android.com 10300dae86f5872b60927b28a32b375bc01cd7c61c9reed@android.comstatic void post_event_to_sink(SkEvent* evt, SkEventSink* sink) { 104dd0ac281e920b01a63789893cc3e7422789658ddreed@android.com evt->setTargetID(sink->getSinkID())->post(); 10500dae86f5872b60927b28a32b375bc01cd7c61c9reed@android.com} 106dd0ac281e920b01a63789893cc3e7422789658ddreed@android.com 10700dae86f5872b60927b28a32b375bc01cd7c61c9reed@android.com/////////////////////////////////////////////////////////////////////////////// 10800dae86f5872b60927b28a32b375bc01cd7c61c9reed@android.com 10900dae86f5872b60927b28a32b375bc01cd7c61c9reed@android.comstatic const char* skip_until(const char* str, const char* skip) { 110d4dfd10bb6f9bf3ac6e1ebc9bc3ae22c6d06321freed@google.com if (!str) { 11100dae86f5872b60927b28a32b375bc01cd7c61c9reed@android.com return NULL; 112dd0ac281e920b01a63789893cc3e7422789658ddreed@android.com } 11300dae86f5872b60927b28a32b375bc01cd7c61c9reed@android.com return strstr(str, skip); 11400dae86f5872b60927b28a32b375bc01cd7c61c9reed@android.com} 11500dae86f5872b60927b28a32b375bc01cd7c61c9reed@android.com 11600dae86f5872b60927b28a32b375bc01cd7c61c9reed@android.comstatic const char* skip_past(const char* str, const char* skip) { 11700dae86f5872b60927b28a32b375bc01cd7c61c9reed@android.com const char* found = skip_until(str, skip); 11800dae86f5872b60927b28a32b375bc01cd7c61c9reed@android.com if (!found) { 11900dae86f5872b60927b28a32b375bc01cd7c61c9reed@android.com return NULL; 120d4dfd10bb6f9bf3ac6e1ebc9bc3ae22c6d06321freed@google.com } 12100dae86f5872b60927b28a32b375bc01cd7c61c9reed@android.com return found + strlen(skip); 12200dae86f5872b60927b28a32b375bc01cd7c61c9reed@android.com} 12300dae86f5872b60927b28a32b375bc01cd7c61c9reed@android.com 12400dae86f5872b60927b28a32b375bc01cd7c61c9reed@android.comstatic const char* gPrefFileName = "sampleapp_prefs.txt"; 125ce057fec926f8ec1d60ed4722d1e51a0086e7976epoger@google.com 126ce057fec926f8ec1d60ed4722d1e51a0086e7976epoger@google.comstatic bool readTitleFromPrefs(SkString* title) { 127ce057fec926f8ec1d60ed4722d1e51a0086e7976epoger@google.com SkFILEStream stream(gPrefFileName); 128ce057fec926f8ec1d60ed4722d1e51a0086e7976epoger@google.com if (!stream.isValid()) { 129ce057fec926f8ec1d60ed4722d1e51a0086e7976epoger@google.com return false; 130686abdfab0e4c45de1fd30774896c46e43a299acvandebo@chromium.org } 1313cb834bd27a16cc60ff30adae96659558c2dc91fjunov@chromium.org 1323cb834bd27a16cc60ff30adae96659558c2dc91fjunov@chromium.org size_t len = stream.getLength(); 1333cb834bd27a16cc60ff30adae96659558c2dc91fjunov@chromium.org SkString data(len); 1343cb834bd27a16cc60ff30adae96659558c2dc91fjunov@chromium.org stream.read(data.writable_str(), len); 1353cb834bd27a16cc60ff30adae96659558c2dc91fjunov@chromium.org const char* s = data.c_str(); 1363cb834bd27a16cc60ff30adae96659558c2dc91fjunov@chromium.org 1373cb834bd27a16cc60ff30adae96659558c2dc91fjunov@chromium.org s = skip_past(s, "curr-slide-title"); 1383cb834bd27a16cc60ff30adae96659558c2dc91fjunov@chromium.org s = skip_past(s, "="); 1393cb834bd27a16cc60ff30adae96659558c2dc91fjunov@chromium.org s = skip_past(s, "\""); 1403cb834bd27a16cc60ff30adae96659558c2dc91fjunov@chromium.org const char* stop = skip_until(s, "\""); 141d393b17cf3427bd6f6255f8670067d9aa529e409commit-bot@chromium.org if (stop > s) { 142686abdfab0e4c45de1fd30774896c46e43a299acvandebo@chromium.org title->set(s, stop - s); 143686abdfab0e4c45de1fd30774896c46e43a299acvandebo@chromium.org return true; 1447361f54294d65a5c42ce5cf1cd56d0fd7122e268bsalomon@google.com } 1457361f54294d65a5c42ce5cf1cd56d0fd7122e268bsalomon@google.com return false; 1467361f54294d65a5c42ce5cf1cd56d0fd7122e268bsalomon@google.com} 1477361f54294d65a5c42ce5cf1cd56d0fd7122e268bsalomon@google.com 148f28dd8ab109663a6fe67fd4ee3d66248e0dac686epoger@google.comstatic void writeTitleToPrefs(const char* title) { 1497361f54294d65a5c42ce5cf1cd56d0fd7122e268bsalomon@google.com SkFILEWStream stream(gPrefFileName); 1507361f54294d65a5c42ce5cf1cd56d0fd7122e268bsalomon@google.com SkString data; 1517361f54294d65a5c42ce5cf1cd56d0fd7122e268bsalomon@google.com data.printf("curr-slide-title = \"%s\"\n", title); 1527361f54294d65a5c42ce5cf1cd56d0fd7122e268bsalomon@google.com stream.write(data.c_str(), data.size()); 1539875dd14af6d768da8d1a4be58b98fc91ceca0ddtomhudson@google.com} 1547361f54294d65a5c42ce5cf1cd56d0fd7122e268bsalomon@google.com 1557361f54294d65a5c42ce5cf1cd56d0fd7122e268bsalomon@google.com/////////////////////////////////////////////////////////////////////////////// 156cf8fb1f6f03fc77f9927564f9ef9abeeeec508d2bsalomon@google.com 1577361f54294d65a5c42ce5cf1cd56d0fd7122e268bsalomon@google.comclass SampleWindow::DefaultDeviceManager : public SampleWindow::DeviceManager { 1587361f54294d65a5c42ce5cf1cd56d0fd7122e268bsalomon@google.compublic: 1597361f54294d65a5c42ce5cf1cd56d0fd7122e268bsalomon@google.com 1604c75f241cb75f202cfa51569ba8dc4749a28a9f7bsalomon@google.com DefaultDeviceManager() { 1619875dd14af6d768da8d1a4be58b98fc91ceca0ddtomhudson@google.com#if SK_SUPPORT_GPU 1629875dd14af6d768da8d1a4be58b98fc91ceca0ddtomhudson@google.com fCurContext = NULL; 1630dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org fCurIntf = NULL; 1640dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org fCurRenderTarget = NULL; 1650dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org fMSAASampleCount = 0; 1660dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org#endif 1670dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org fBackend = kNone_BackEndType; 1680dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org } 16910afbefa5b60b0f7e8d2b02f4c996de88aa26830mike@reedtribe.org 17010afbefa5b60b0f7e8d2b02f4c996de88aa26830mike@reedtribe.org virtual ~DefaultDeviceManager() { 171971aca75572ed6e0c5e1cc959173dc58ca7b6b8dreed@google.com#if SK_SUPPORT_GPU 17210afbefa5b60b0f7e8d2b02f4c996de88aa26830mike@reedtribe.org SkSafeUnref(fCurContext); 173971aca75572ed6e0c5e1cc959173dc58ca7b6b8dreed@google.com SkSafeUnref(fCurIntf); 17410afbefa5b60b0f7e8d2b02f4c996de88aa26830mike@reedtribe.org SkSafeUnref(fCurRenderTarget); 17510afbefa5b60b0f7e8d2b02f4c996de88aa26830mike@reedtribe.org#endif 17610afbefa5b60b0f7e8d2b02f4c996de88aa26830mike@reedtribe.org } 177971aca75572ed6e0c5e1cc959173dc58ca7b6b8dreed@google.com 17810afbefa5b60b0f7e8d2b02f4c996de88aa26830mike@reedtribe.org virtual void setUpBackend(SampleWindow* win, int msaaSampleCount) { 17910afbefa5b60b0f7e8d2b02f4c996de88aa26830mike@reedtribe.org SkASSERT(kNone_BackEndType == fBackend); 180de96163a80167636d95837f9ee6a2e98baf9d350epoger@google.com 181de96163a80167636d95837f9ee6a2e98baf9d350epoger@google.com fBackend = kNone_BackEndType; 182de96163a80167636d95837f9ee6a2e98baf9d350epoger@google.com 183de96163a80167636d95837f9ee6a2e98baf9d350epoger@google.com#if SK_SUPPORT_GPU 184de96163a80167636d95837f9ee6a2e98baf9d350epoger@google.com switch (win->getDeviceType()) { 185de96163a80167636d95837f9ee6a2e98baf9d350epoger@google.com case kRaster_DeviceType: 186de96163a80167636d95837f9ee6a2e98baf9d350epoger@google.com // fallthrough 187de96163a80167636d95837f9ee6a2e98baf9d350epoger@google.com case kPicture_DeviceType: 188de96163a80167636d95837f9ee6a2e98baf9d350epoger@google.com // fallthrough 189de96163a80167636d95837f9ee6a2e98baf9d350epoger@google.com case kGPU_DeviceType: 190de96163a80167636d95837f9ee6a2e98baf9d350epoger@google.com // fallthrough 191de96163a80167636d95837f9ee6a2e98baf9d350epoger@google.com case kNullGPU_DeviceType: 192608ea6508ae2e9ea05ea863ba50fc27d44d2eae9commit-bot@chromium.org // all these guys use the native backend 19373a7ea3ae0d37ee28f90d6b38c49fda052638253edisonn@google.com fBackend = kNativeGL_BackEndType; 194d9dfa18372119c8e1318125d2075fa80e0819094edisonn@google.com break; 1955079d2c2a0dc0deacecccc6ef9d1c45c6c7982e4epoger@google.com#if SK_ANGLE 1965079d2c2a0dc0deacecccc6ef9d1c45c6c7982e4epoger@google.com case kANGLE_DeviceType: 1975079d2c2a0dc0deacecccc6ef9d1c45c6c7982e4epoger@google.com // ANGLE is really the only odd man out 1985079d2c2a0dc0deacecccc6ef9d1c45c6c7982e4epoger@google.com fBackend = kANGLE_BackEndType; 199de96163a80167636d95837f9ee6a2e98baf9d350epoger@google.com break; 200de96163a80167636d95837f9ee6a2e98baf9d350epoger@google.com#endif // SK_ANGLE 2016f7f14d061b045a58a888ee5450b4596797dc453epoger@google.com default: 2026f7f14d061b045a58a888ee5450b4596797dc453epoger@google.com SkASSERT(false); 2035f99545de67ee729b4b17f1aae56f8c9dcf460f9epoger@google.com break; 2045f99545de67ee729b4b17f1aae56f8c9dcf460f9epoger@google.com } 205e8ebeb1f8fde6525bbab988c6090a5d3ab19855bepoger@google.com AttachmentInfo attachmentInfo; 206659c8c06cdc6c825004515240f81a8dafb2b4b0fepoger@google.com bool result = win->attach(fBackend, msaaSampleCount, &attachmentInfo); 207659c8c06cdc6c825004515240f81a8dafb2b4b0fepoger@google.com if (!result) { 208659c8c06cdc6c825004515240f81a8dafb2b4b0fepoger@google.com SkDebugf("Failed to initialize GL"); 209659c8c06cdc6c825004515240f81a8dafb2b4b0fepoger@google.com return; 210659c8c06cdc6c825004515240f81a8dafb2b4b0fepoger@google.com } 211659c8c06cdc6c825004515240f81a8dafb2b4b0fepoger@google.com fMSAASampleCount = msaaSampleCount; 212659c8c06cdc6c825004515240f81a8dafb2b4b0fepoger@google.com 213659c8c06cdc6c825004515240f81a8dafb2b4b0fepoger@google.com SkASSERT(NULL == fCurIntf); 214e8ebeb1f8fde6525bbab988c6090a5d3ab19855bepoger@google.com SkAutoTUnref<const GrGLInterface> glInterface; 21557f7abc8659f17e58fc2d1410117033ad524f9d3epoger@google.com switch (win->getDeviceType()) { 21657f7abc8659f17e58fc2d1410117033ad524f9d3epoger@google.com case kRaster_DeviceType: 21757f7abc8659f17e58fc2d1410117033ad524f9d3epoger@google.com // fallthrough 218e8ebeb1f8fde6525bbab988c6090a5d3ab19855bepoger@google.com case kPicture_DeviceType: 219e8ebeb1f8fde6525bbab988c6090a5d3ab19855bepoger@google.com // fallthrough 220e8ebeb1f8fde6525bbab988c6090a5d3ab19855bepoger@google.com case kGPU_DeviceType: 221e8ebeb1f8fde6525bbab988c6090a5d3ab19855bepoger@google.com // all these guys use the native interface 222de96163a80167636d95837f9ee6a2e98baf9d350epoger@google.com glInterface.reset(GrGLCreateNativeInterface()); 22310afbefa5b60b0f7e8d2b02f4c996de88aa26830mike@reedtribe.org break; 22410afbefa5b60b0f7e8d2b02f4c996de88aa26830mike@reedtribe.org#if SK_ANGLE 225659c8c06cdc6c825004515240f81a8dafb2b4b0fepoger@google.com case kANGLE_DeviceType: 226659c8c06cdc6c825004515240f81a8dafb2b4b0fepoger@google.com glInterface.reset(GrGLCreateANGLEInterface()); 227659c8c06cdc6c825004515240f81a8dafb2b4b0fepoger@google.com break; 228659c8c06cdc6c825004515240f81a8dafb2b4b0fepoger@google.com#endif // SK_ANGLE 229659c8c06cdc6c825004515240f81a8dafb2b4b0fepoger@google.com case kNullGPU_DeviceType: 230659c8c06cdc6c825004515240f81a8dafb2b4b0fepoger@google.com glInterface.reset(GrGLCreateNullInterface()); 231659c8c06cdc6c825004515240f81a8dafb2b4b0fepoger@google.com break; 232659c8c06cdc6c825004515240f81a8dafb2b4b0fepoger@google.com default: 233659c8c06cdc6c825004515240f81a8dafb2b4b0fepoger@google.com SkASSERT(false); 234659c8c06cdc6c825004515240f81a8dafb2b4b0fepoger@google.com break; 235659c8c06cdc6c825004515240f81a8dafb2b4b0fepoger@google.com } 236659c8c06cdc6c825004515240f81a8dafb2b4b0fepoger@google.com 237ccd7afb6fb2df9774e57fb4d7f62f9504cabf03escroggo@google.com // Currently SampleApp does not use NVPR. TODO: Provide an NVPR device type that is skipped 238659c8c06cdc6c825004515240f81a8dafb2b4b0fepoger@google.com // when the driver doesn't support NVPR. 239659c8c06cdc6c825004515240f81a8dafb2b4b0fepoger@google.com fCurIntf = GrGLInterfaceRemoveNVPR(glInterface.get()); 2406f7f14d061b045a58a888ee5450b4596797dc453epoger@google.com 2416f7f14d061b045a58a888ee5450b4596797dc453epoger@google.com SkASSERT(NULL == fCurContext); 2426f7f14d061b045a58a888ee5450b4596797dc453epoger@google.com fCurContext = GrContext::Create(kOpenGL_GrBackend, (GrBackendContext) fCurIntf); 2436f7f14d061b045a58a888ee5450b4596797dc453epoger@google.com 2446f7f14d061b045a58a888ee5450b4596797dc453epoger@google.com if (NULL == fCurContext || NULL == fCurIntf) { 2456f7f14d061b045a58a888ee5450b4596797dc453epoger@google.com // We need some context and interface to see results 2466f7f14d061b045a58a888ee5450b4596797dc453epoger@google.com SkSafeUnref(fCurContext); 2476f7f14d061b045a58a888ee5450b4596797dc453epoger@google.com SkSafeUnref(fCurIntf); 2486f7f14d061b045a58a888ee5450b4596797dc453epoger@google.com fCurContext = NULL; 2496f7f14d061b045a58a888ee5450b4596797dc453epoger@google.com fCurIntf = NULL; 2506f7f14d061b045a58a888ee5450b4596797dc453epoger@google.com SkDebugf("Failed to setup 3D"); 2516f7f14d061b045a58a888ee5450b4596797dc453epoger@google.com 2526f7f14d061b045a58a888ee5450b4596797dc453epoger@google.com win->detach(); 2536f7f14d061b045a58a888ee5450b4596797dc453epoger@google.com } 2546f7f14d061b045a58a888ee5450b4596797dc453epoger@google.com#endif // SK_SUPPORT_GPU 2556f7f14d061b045a58a888ee5450b4596797dc453epoger@google.com // call windowSizeChanged to create the render target 2566f7f14d061b045a58a888ee5450b4596797dc453epoger@google.com this->windowSizeChanged(win); 2576f7f14d061b045a58a888ee5450b4596797dc453epoger@google.com } 2586f7f14d061b045a58a888ee5450b4596797dc453epoger@google.com 2596f7f14d061b045a58a888ee5450b4596797dc453epoger@google.com virtual void tearDownBackend(SampleWindow *win) { 2606f7f14d061b045a58a888ee5450b4596797dc453epoger@google.com#if SK_SUPPORT_GPU 2616f7f14d061b045a58a888ee5450b4596797dc453epoger@google.com SkSafeUnref(fCurContext); 2626f7f14d061b045a58a888ee5450b4596797dc453epoger@google.com fCurContext = NULL; 2636f7f14d061b045a58a888ee5450b4596797dc453epoger@google.com 264de96163a80167636d95837f9ee6a2e98baf9d350epoger@google.com SkSafeUnref(fCurIntf); 265de96163a80167636d95837f9ee6a2e98baf9d350epoger@google.com fCurIntf = NULL; 266de96163a80167636d95837f9ee6a2e98baf9d350epoger@google.com 267de96163a80167636d95837f9ee6a2e98baf9d350epoger@google.com SkSafeUnref(fCurRenderTarget); 268de96163a80167636d95837f9ee6a2e98baf9d350epoger@google.com fCurRenderTarget = NULL; 269dac522589e9395b4654a1a708f1bd971f37f95a5commit-bot@chromium.org#endif 270dac522589e9395b4654a1a708f1bd971f37f95a5commit-bot@chromium.org win->detach(); 27128fcae2ec77eb16a79e155f8d788b20457f1c951commit-bot@chromium.org fBackend = kNone_BackEndType; 2725f6a00775511b5675607c2bfdbb096c0a815025depoger@google.com } 2735f6a00775511b5675607c2bfdbb096c0a815025depoger@google.com 274dac522589e9395b4654a1a708f1bd971f37f95a5commit-bot@chromium.org virtual SkSurface* createSurface(SampleWindow::DeviceType dType, 2755f6a00775511b5675607c2bfdbb096c0a815025depoger@google.com SampleWindow* win) SK_OVERRIDE { 2765f6a00775511b5675607c2bfdbb096c0a815025depoger@google.com#if SK_SUPPORT_GPU 2775f6a00775511b5675607c2bfdbb096c0a815025depoger@google.com if (IsGpuDeviceType(dType) && fCurContext) { 2782b3a204bf68c9e41e62e0f2db5dfe263ea811424commit-bot@chromium.org return SkSurface::NewRenderTargetDirect(fCurRenderTarget); 2795efdd0cb9cdf4c2017dc6ad70b2503bf04234d9bepoger@google.com } 2805f6a00775511b5675607c2bfdbb096c0a815025depoger@google.com#endif 2815f6a00775511b5675607c2bfdbb096c0a815025depoger@google.com return NULL; 2825f6a00775511b5675607c2bfdbb096c0a815025depoger@google.com } 2835f6a00775511b5675607c2bfdbb096c0a815025depoger@google.com 284de96163a80167636d95837f9ee6a2e98baf9d350epoger@google.com virtual void publishCanvas(SampleWindow::DeviceType dType, 285de96163a80167636d95837f9ee6a2e98baf9d350epoger@google.com SkCanvas* canvas, 286de96163a80167636d95837f9ee6a2e98baf9d350epoger@google.com SampleWindow* win) { 287de96163a80167636d95837f9ee6a2e98baf9d350epoger@google.com#if SK_SUPPORT_GPU 288de96163a80167636d95837f9ee6a2e98baf9d350epoger@google.com if (fCurContext) { 289de96163a80167636d95837f9ee6a2e98baf9d350epoger@google.com // in case we have queued drawing calls 29079d3cb4ba74651ceaa862005a4244460e4662afdvandebo@chromium.org fCurContext->flush(); 29110afbefa5b60b0f7e8d2b02f4c996de88aa26830mike@reedtribe.org 2920dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org if (!IsGpuDeviceType(dType)) { 2935f6a00775511b5675607c2bfdbb096c0a815025depoger@google.com // need to send the raster bits to the (gpu) window 2945f6a00775511b5675607c2bfdbb096c0a815025depoger@google.com fCurContext->setRenderTarget(fCurRenderTarget); 2955f6a00775511b5675607c2bfdbb096c0a815025depoger@google.com const SkBitmap& bm = win->getBitmap(); 296de96163a80167636d95837f9ee6a2e98baf9d350epoger@google.com fCurRenderTarget->writePixels(0, 0, bm.width(), bm.height(), 29728fcae2ec77eb16a79e155f8d788b20457f1c951commit-bot@chromium.org SkImageInfo2GrPixelConfig(bm.colorType(), 2980dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org bm.alphaType()), 2990dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org bm.getPixels(), 3000dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org bm.rowBytes()); 3012b3a204bf68c9e41e62e0f2db5dfe263ea811424commit-bot@chromium.org } 3020dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org } 3030dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org#endif 3040dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org 305de96163a80167636d95837f9ee6a2e98baf9d350epoger@google.com win->present(); 3069875dd14af6d768da8d1a4be58b98fc91ceca0ddtomhudson@google.com } 3076f6568b27eae62fea23ab8192c6da02ab892bb5eepoger@google.com 308310478e72c63e639373465216271b81f1e4a9136epoger@google.com virtual void windowSizeChanged(SampleWindow* win) { 3096f6568b27eae62fea23ab8192c6da02ab892bb5eepoger@google.com#if SK_SUPPORT_GPU 310310478e72c63e639373465216271b81f1e4a9136epoger@google.com if (fCurContext) { 311310478e72c63e639373465216271b81f1e4a9136epoger@google.com AttachmentInfo attachmentInfo; 312310478e72c63e639373465216271b81f1e4a9136epoger@google.com win->attach(fBackend, fMSAASampleCount, &attachmentInfo); 313310478e72c63e639373465216271b81f1e4a9136epoger@google.com 314310478e72c63e639373465216271b81f1e4a9136epoger@google.com GrBackendRenderTargetDesc desc; 315310478e72c63e639373465216271b81f1e4a9136epoger@google.com desc.fWidth = SkScalarRoundToInt(win->width()); 316310478e72c63e639373465216271b81f1e4a9136epoger@google.com desc.fHeight = SkScalarRoundToInt(win->height()); 317310478e72c63e639373465216271b81f1e4a9136epoger@google.com desc.fConfig = kSkia8888_GrPixelConfig; 318310478e72c63e639373465216271b81f1e4a9136epoger@google.com desc.fOrigin = kBottomLeft_GrSurfaceOrigin; 319310478e72c63e639373465216271b81f1e4a9136epoger@google.com desc.fSampleCnt = attachmentInfo.fSampleCount; 320310478e72c63e639373465216271b81f1e4a9136epoger@google.com desc.fStencilBits = attachmentInfo.fStencilBits; 321310478e72c63e639373465216271b81f1e4a9136epoger@google.com GrGLint buffer; 322310478e72c63e639373465216271b81f1e4a9136epoger@google.com GR_GL_GetIntegerv(fCurIntf, GR_GL_FRAMEBUFFER_BINDING, &buffer); 323310478e72c63e639373465216271b81f1e4a9136epoger@google.com desc.fRenderTargetHandle = buffer; 32485195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org 325310478e72c63e639373465216271b81f1e4a9136epoger@google.com SkSafeUnref(fCurRenderTarget); 326310478e72c63e639373465216271b81f1e4a9136epoger@google.com fCurRenderTarget = fCurContext->wrapBackendRenderTarget(desc); 327310478e72c63e639373465216271b81f1e4a9136epoger@google.com } 328310478e72c63e639373465216271b81f1e4a9136epoger@google.com#endif 3293a882dda0787e6957cfb37f6b5a68bcd31ce5cf7epoger@google.com } 3303a882dda0787e6957cfb37f6b5a68bcd31ce5cf7epoger@google.com 3313e62ebf93b43139202ce803245411467c7ed13ffcommit-bot@chromium.org virtual GrContext* getGrContext() { 3323e62ebf93b43139202ce803245411467c7ed13ffcommit-bot@chromium.org#if SK_SUPPORT_GPU 3333e62ebf93b43139202ce803245411467c7ed13ffcommit-bot@chromium.org return fCurContext; 3343a882dda0787e6957cfb37f6b5a68bcd31ce5cf7epoger@google.com#else 3353a882dda0787e6957cfb37f6b5a68bcd31ce5cf7epoger@google.com return NULL; 3363a882dda0787e6957cfb37f6b5a68bcd31ce5cf7epoger@google.com#endif 3373a882dda0787e6957cfb37f6b5a68bcd31ce5cf7epoger@google.com } 3383a882dda0787e6957cfb37f6b5a68bcd31ce5cf7epoger@google.com 3393a882dda0787e6957cfb37f6b5a68bcd31ce5cf7epoger@google.com virtual GrRenderTarget* getGrRenderTarget() SK_OVERRIDE { 3403a882dda0787e6957cfb37f6b5a68bcd31ce5cf7epoger@google.com#if SK_SUPPORT_GPU 34185195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org return fCurRenderTarget; 34285195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org#else 34385195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org return NULL; 34485195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org#endif 34585195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org } 34685195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org 34785195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.orgprivate: 34885195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org 34985195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org#if SK_SUPPORT_GPU 35085195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org GrContext* fCurContext; 35185195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org const GrGLInterface* fCurIntf; 35285195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org GrRenderTarget* fCurRenderTarget; 35385195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org int fMSAASampleCount; 35485195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org#endif 35585195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org 35685195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org SkOSWindow::SkBackEndTypes fBackend; 35785195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org 35885195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org typedef SampleWindow::DeviceManager INHERITED; 35985195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org}; 36085195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org 36185195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org/////////////// 362310478e72c63e639373465216271b81f1e4a9136epoger@google.comstatic const char view_inval_msg[] = "view-inval-msg"; 363310478e72c63e639373465216271b81f1e4a9136epoger@google.com 364310478e72c63e639373465216271b81f1e4a9136epoger@google.comvoid SampleWindow::postInvalDelay() { 365310478e72c63e639373465216271b81f1e4a9136epoger@google.com (new SkEvent(view_inval_msg, this->getSinkID()))->postDelay(1); 366310478e72c63e639373465216271b81f1e4a9136epoger@google.com} 367659c8c06cdc6c825004515240f81a8dafb2b4b0fepoger@google.com 368659c8c06cdc6c825004515240f81a8dafb2b4b0fepoger@google.comstatic bool isInvalEvent(const SkEvent& evt) { 369310478e72c63e639373465216271b81f1e4a9136epoger@google.com return evt.isType(view_inval_msg); 370310478e72c63e639373465216271b81f1e4a9136epoger@google.com} 371310478e72c63e639373465216271b81f1e4a9136epoger@google.com////////////////// 372310478e72c63e639373465216271b81f1e4a9136epoger@google.com 373310478e72c63e639373465216271b81f1e4a9136epoger@google.comSkFuncViewFactory::SkFuncViewFactory(SkViewCreateFunc func) 374310478e72c63e639373465216271b81f1e4a9136epoger@google.com : fCreateFunc(func) { 375310478e72c63e639373465216271b81f1e4a9136epoger@google.com} 376310478e72c63e639373465216271b81f1e4a9136epoger@google.com 3776f6568b27eae62fea23ab8192c6da02ab892bb5eepoger@google.comSkView* SkFuncViewFactory::operator() () const { 37815655b241bfe1d77032e88115f119684722c10e0epoger@google.com return (*fCreateFunc)(); 379eb06636133b6b5971964e5bce5ce5ca71d9ea960epoger@google.com} 380eb06636133b6b5971964e5bce5ce5ca71d9ea960epoger@google.com 381310478e72c63e639373465216271b81f1e4a9136epoger@google.com#include "GMSampleView.h" 382659c8c06cdc6c825004515240f81a8dafb2b4b0fepoger@google.com 383caac3db48f74676889006b5520b766b572b5e9b2epoger@google.comSkGMSampleViewFactory::SkGMSampleViewFactory(GMFactoryFunc func) 384310478e72c63e639373465216271b81f1e4a9136epoger@google.com : fFunc(func) { 385310478e72c63e639373465216271b81f1e4a9136epoger@google.com} 386310478e72c63e639373465216271b81f1e4a9136epoger@google.com 387310478e72c63e639373465216271b81f1e4a9136epoger@google.comSkView* SkGMSampleViewFactory::operator() () const { 388310478e72c63e639373465216271b81f1e4a9136epoger@google.com skiagm::GM* gm = fFunc(NULL); 38957f7abc8659f17e58fc2d1410117033ad524f9d3epoger@google.com gm->setMode(skiagm::GM::kSample_Mode); 390310478e72c63e639373465216271b81f1e4a9136epoger@google.com return new GMSampleView(gm); 39115655b241bfe1d77032e88115f119684722c10e0epoger@google.com} 392310478e72c63e639373465216271b81f1e4a9136epoger@google.com 393310478e72c63e639373465216271b81f1e4a9136epoger@google.comSkViewRegister* SkViewRegister::gHead; 394310478e72c63e639373465216271b81f1e4a9136epoger@google.comSkViewRegister::SkViewRegister(SkViewFactory* fact) : fFact(fact) { 395310478e72c63e639373465216271b81f1e4a9136epoger@google.com fFact->ref(); 396310478e72c63e639373465216271b81f1e4a9136epoger@google.com fChain = gHead; 397310478e72c63e639373465216271b81f1e4a9136epoger@google.com gHead = this; 398310478e72c63e639373465216271b81f1e4a9136epoger@google.com} 399310478e72c63e639373465216271b81f1e4a9136epoger@google.com 4005079d2c2a0dc0deacecccc6ef9d1c45c6c7982e4epoger@google.comSkViewRegister::SkViewRegister(SkViewCreateFunc func) { 401310478e72c63e639373465216271b81f1e4a9136epoger@google.com fFact = new SkFuncViewFactory(func); 402310478e72c63e639373465216271b81f1e4a9136epoger@google.com fChain = gHead; 403310478e72c63e639373465216271b81f1e4a9136epoger@google.com gHead = this; 404310478e72c63e639373465216271b81f1e4a9136epoger@google.com} 40557f7abc8659f17e58fc2d1410117033ad524f9d3epoger@google.com 40657f7abc8659f17e58fc2d1410117033ad524f9d3epoger@google.comSkViewRegister::SkViewRegister(GMFactoryFunc func) { 407310478e72c63e639373465216271b81f1e4a9136epoger@google.com fFact = new SkGMSampleViewFactory(func); 40851dbabee67ea1285e1115e535d26944d4da99be5epoger@google.com fChain = gHead; 40951dbabee67ea1285e1115e535d26944d4da99be5epoger@google.com gHead = this; 41051dbabee67ea1285e1115e535d26944d4da99be5epoger@google.com} 41151dbabee67ea1285e1115e535d26944d4da99be5epoger@google.com 41251dbabee67ea1285e1115e535d26944d4da99be5epoger@google.comclass AutoUnrefArray { 41351dbabee67ea1285e1115e535d26944d4da99be5epoger@google.compublic: 4145079d2c2a0dc0deacecccc6ef9d1c45c6c7982e4epoger@google.com AutoUnrefArray() {} 41551dbabee67ea1285e1115e535d26944d4da99be5epoger@google.com ~AutoUnrefArray() { 41651dbabee67ea1285e1115e535d26944d4da99be5epoger@google.com int count = fObjs.count(); 41751dbabee67ea1285e1115e535d26944d4da99be5epoger@google.com for (int i = 0; i < count; ++i) { 41851dbabee67ea1285e1115e535d26944d4da99be5epoger@google.com fObjs[i]->unref(); 41951dbabee67ea1285e1115e535d26944d4da99be5epoger@google.com } 42051dbabee67ea1285e1115e535d26944d4da99be5epoger@google.com } 42151dbabee67ea1285e1115e535d26944d4da99be5epoger@google.com SkRefCnt*& push_back() { return *fObjs.append(); } 42251dbabee67ea1285e1115e535d26944d4da99be5epoger@google.com 42351dbabee67ea1285e1115e535d26944d4da99be5epoger@google.comprivate: 42451dbabee67ea1285e1115e535d26944d4da99be5epoger@google.com SkTDArray<SkRefCnt*> fObjs; 42551dbabee67ea1285e1115e535d26944d4da99be5epoger@google.com}; 42651dbabee67ea1285e1115e535d26944d4da99be5epoger@google.com 42751dbabee67ea1285e1115e535d26944d4da99be5epoger@google.com// registers GMs as Samples 42851dbabee67ea1285e1115e535d26944d4da99be5epoger@google.com// This can't be performed during static initialization because it could be 42951dbabee67ea1285e1115e535d26944d4da99be5epoger@google.com// run before GMRegistry has been fully built. 43051dbabee67ea1285e1115e535d26944d4da99be5epoger@google.comstatic void SkGMRegistyToSampleRegistry() { 43151dbabee67ea1285e1115e535d26944d4da99be5epoger@google.com static bool gOnce; 43251dbabee67ea1285e1115e535d26944d4da99be5epoger@google.com static AutoUnrefArray fRegisters; 4332b3a204bf68c9e41e62e0f2db5dfe263ea811424commit-bot@chromium.org 43451dbabee67ea1285e1115e535d26944d4da99be5epoger@google.com if (!gOnce) { 43551dbabee67ea1285e1115e535d26944d4da99be5epoger@google.com const skiagm::GMRegistry* gmreg = skiagm::GMRegistry::Head(); 43651dbabee67ea1285e1115e535d26944d4da99be5epoger@google.com while (gmreg) { 437310478e72c63e639373465216271b81f1e4a9136epoger@google.com fRegisters.push_back() = new SkViewRegister(gmreg->factory()); 43851dbabee67ea1285e1115e535d26944d4da99be5epoger@google.com gmreg = gmreg->next(); 43951dbabee67ea1285e1115e535d26944d4da99be5epoger@google.com } 440310478e72c63e639373465216271b81f1e4a9136epoger@google.com gOnce = true; 44151dbabee67ea1285e1115e535d26944d4da99be5epoger@google.com } 442310478e72c63e639373465216271b81f1e4a9136epoger@google.com} 443310478e72c63e639373465216271b81f1e4a9136epoger@google.com 444310478e72c63e639373465216271b81f1e4a9136epoger@google.com////////////////////////////////////////////////////////////////////////////// 445310478e72c63e639373465216271b81f1e4a9136epoger@google.com 446310478e72c63e639373465216271b81f1e4a9136epoger@google.comenum FlipAxisEnum { 447310478e72c63e639373465216271b81f1e4a9136epoger@google.com kFlipAxis_X = (1 << 0), 448310478e72c63e639373465216271b81f1e4a9136epoger@google.com kFlipAxis_Y = (1 << 1) 4492b3a204bf68c9e41e62e0f2db5dfe263ea811424commit-bot@chromium.org}; 450310478e72c63e639373465216271b81f1e4a9136epoger@google.com 451310478e72c63e639373465216271b81f1e4a9136epoger@google.com#include "SkDrawFilter.h" 452310478e72c63e639373465216271b81f1e4a9136epoger@google.com 45351dbabee67ea1285e1115e535d26944d4da99be5epoger@google.comstruct HintingState { 45457f7abc8659f17e58fc2d1410117033ad524f9d3epoger@google.com SkPaint::Hinting hinting; 4552b3a204bf68c9e41e62e0f2db5dfe263ea811424commit-bot@chromium.org const char* name; 45657f7abc8659f17e58fc2d1410117033ad524f9d3epoger@google.com const char* label; 45757f7abc8659f17e58fc2d1410117033ad524f9d3epoger@google.com}; 4580dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.orgstatic HintingState gHintingStates[] = { 459de96163a80167636d95837f9ee6a2e98baf9d350epoger@google.com {SkPaint::kNo_Hinting, "Mixed", NULL }, 4600dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org {SkPaint::kNo_Hinting, "None", "H0 " }, 4612b3a204bf68c9e41e62e0f2db5dfe263ea811424commit-bot@chromium.org {SkPaint::kSlight_Hinting, "Slight", "Hs " }, 4620dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org {SkPaint::kNormal_Hinting, "Normal", "Hn " }, 4630dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org {SkPaint::kFull_Hinting, "Full", "Hf " }, 4640dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org}; 465de96163a80167636d95837f9ee6a2e98baf9d350epoger@google.com 4669875dd14af6d768da8d1a4be58b98fc91ceca0ddtomhudson@google.comstruct FilterLevelState { 4675f6a00775511b5675607c2bfdbb096c0a815025depoger@google.com SkPaint::FilterLevel fLevel; 4685f6a00775511b5675607c2bfdbb096c0a815025depoger@google.com const char* fName; 4695f6a00775511b5675607c2bfdbb096c0a815025depoger@google.com const char* fLabel; 4705f6a00775511b5675607c2bfdbb096c0a815025depoger@google.com}; 4715f6a00775511b5675607c2bfdbb096c0a815025depoger@google.comstatic FilterLevelState gFilterLevelStates[] = { 4725f6a00775511b5675607c2bfdbb096c0a815025depoger@google.com { SkPaint::kNone_FilterLevel, "Mixed", NULL }, 4735f6a00775511b5675607c2bfdbb096c0a815025depoger@google.com { SkPaint::kNone_FilterLevel, "None", "F0 " }, 4745f6a00775511b5675607c2bfdbb096c0a815025depoger@google.com { SkPaint::kLow_FilterLevel, "Low", "F1 " }, 4755f6a00775511b5675607c2bfdbb096c0a815025depoger@google.com { SkPaint::kMedium_FilterLevel, "Medium", "F2 " }, 4765f6a00775511b5675607c2bfdbb096c0a815025depoger@google.com { SkPaint::kHigh_FilterLevel, "High", "F3 " }, 4775f6a00775511b5675607c2bfdbb096c0a815025depoger@google.com}; 478de96163a80167636d95837f9ee6a2e98baf9d350epoger@google.com 479de96163a80167636d95837f9ee6a2e98baf9d350epoger@google.comclass FlagsDrawFilter : public SkDrawFilter { 480eb9a46cbbb475e862a084aa2224ec18d4ac5e95breed@google.compublic: 481dbfac8a72393eaf01670aeb3244de0e18d8faf98junov@google.com FlagsDrawFilter(SkOSMenu::TriState lcd, SkOSMenu::TriState aa, 48279d3cb4ba74651ceaa862005a4244460e4662afdvandebo@chromium.org SkOSMenu::TriState subpixel, int hinting, int filterlevel) 4839875dd14af6d768da8d1a4be58b98fc91ceca0ddtomhudson@google.com : fLCDState(lcd) 4845f6a00775511b5675607c2bfdbb096c0a815025depoger@google.com , fAAState(aa) 4855f6a00775511b5675607c2bfdbb096c0a815025depoger@google.com , fSubpixelState(subpixel) 4865f6a00775511b5675607c2bfdbb096c0a815025depoger@google.com , fHintingState(hinting) 4875f6a00775511b5675607c2bfdbb096c0a815025depoger@google.com , fFilterLevelIndex(filterlevel) 4885f6a00775511b5675607c2bfdbb096c0a815025depoger@google.com { 4895f6a00775511b5675607c2bfdbb096c0a815025depoger@google.com SkASSERT((unsigned)filterlevel < SK_ARRAY_COUNT(gFilterLevelStates)); 4905f6a00775511b5675607c2bfdbb096c0a815025depoger@google.com } 4915f6a00775511b5675607c2bfdbb096c0a815025depoger@google.com 4925f6a00775511b5675607c2bfdbb096c0a815025depoger@google.com virtual bool filter(SkPaint* paint, Type t) { 4935f6a00775511b5675607c2bfdbb096c0a815025depoger@google.com if (kText_Type == t && SkOSMenu::kMixedState != fLCDState) { 4945f6a00775511b5675607c2bfdbb096c0a815025depoger@google.com paint->setLCDRenderText(SkOSMenu::kOnState == fLCDState); 4955f6a00775511b5675607c2bfdbb096c0a815025depoger@google.com } 4965f6a00775511b5675607c2bfdbb096c0a815025depoger@google.com if (SkOSMenu::kMixedState != fAAState) { 4975f6a00775511b5675607c2bfdbb096c0a815025depoger@google.com paint->setAntiAlias(SkOSMenu::kOnState == fAAState); 4985f6a00775511b5675607c2bfdbb096c0a815025depoger@google.com } 4995f6a00775511b5675607c2bfdbb096c0a815025depoger@google.com if (0 != fFilterLevelIndex) { 5005f6a00775511b5675607c2bfdbb096c0a815025depoger@google.com paint->setFilterLevel(gFilterLevelStates[fFilterLevelIndex].fLevel); 5015f6a00775511b5675607c2bfdbb096c0a815025depoger@google.com } 5025f6a00775511b5675607c2bfdbb096c0a815025depoger@google.com if (SkOSMenu::kMixedState != fSubpixelState) { 5035f6a00775511b5675607c2bfdbb096c0a815025depoger@google.com paint->setSubpixelText(SkOSMenu::kOnState == fSubpixelState); 5045f6a00775511b5675607c2bfdbb096c0a815025depoger@google.com } 5055f6a00775511b5675607c2bfdbb096c0a815025depoger@google.com if (0 != fHintingState && fHintingState < (int)SK_ARRAY_COUNT(gHintingStates)) { 5065f6a00775511b5675607c2bfdbb096c0a815025depoger@google.com paint->setHinting(gHintingStates[fHintingState].hinting); 5075f6a00775511b5675607c2bfdbb096c0a815025depoger@google.com } 5085f6a00775511b5675607c2bfdbb096c0a815025depoger@google.com return true; 5095f6a00775511b5675607c2bfdbb096c0a815025depoger@google.com } 5105f6a00775511b5675607c2bfdbb096c0a815025depoger@google.com 511908f5836626d792c5e33ad93f44c6a418a0cc8f5epoger@google.comprivate: 5125f6a00775511b5675607c2bfdbb096c0a815025depoger@google.com SkOSMenu::TriState fLCDState; 5135f6a00775511b5675607c2bfdbb096c0a815025depoger@google.com SkOSMenu::TriState fAAState; 5145f6a00775511b5675607c2bfdbb096c0a815025depoger@google.com SkOSMenu::TriState fSubpixelState; 5155f6a00775511b5675607c2bfdbb096c0a815025depoger@google.com int fHintingState; 516908f5836626d792c5e33ad93f44c6a418a0cc8f5epoger@google.com int fFilterLevelIndex; 5175f6a00775511b5675607c2bfdbb096c0a815025depoger@google.com}; 5185f6a00775511b5675607c2bfdbb096c0a815025depoger@google.com 5195f6a00775511b5675607c2bfdbb096c0a815025depoger@google.com////////////////////////////////////////////////////////////////////////////// 5205f6a00775511b5675607c2bfdbb096c0a815025depoger@google.com 5215f6a00775511b5675607c2bfdbb096c0a815025depoger@google.com#define MAX_ZOOM_LEVEL 8 5225f6a00775511b5675607c2bfdbb096c0a815025depoger@google.com#define MIN_ZOOM_LEVEL -8 523908f5836626d792c5e33ad93f44c6a418a0cc8f5epoger@google.com 5245f6a00775511b5675607c2bfdbb096c0a815025depoger@google.comstatic const char gCharEvtName[] = "SampleCode_Char_Event"; 5255f6a00775511b5675607c2bfdbb096c0a815025depoger@google.comstatic const char gKeyEvtName[] = "SampleCode_Key_Event"; 5265f6a00775511b5675607c2bfdbb096c0a815025depoger@google.comstatic const char gTitleEvtName[] = "SampleCode_Title_Event"; 5275f6a00775511b5675607c2bfdbb096c0a815025depoger@google.comstatic const char gPrefSizeEvtName[] = "SampleCode_PrefSize_Event"; 528908f5836626d792c5e33ad93f44c6a418a0cc8f5epoger@google.comstatic const char gFastTextEvtName[] = "SampleCode_FastText_Event"; 5295f6a00775511b5675607c2bfdbb096c0a815025depoger@google.comstatic const char gUpdateWindowTitleEvtName[] = "SampleCode_UpdateWindowTitle"; 5305f6a00775511b5675607c2bfdbb096c0a815025depoger@google.com 5315f6a00775511b5675607c2bfdbb096c0a815025depoger@google.combool SampleCode::CharQ(const SkEvent& evt, SkUnichar* outUni) { 5325f6a00775511b5675607c2bfdbb096c0a815025depoger@google.com if (evt.isType(gCharEvtName, sizeof(gCharEvtName) - 1)) { 5335f6a00775511b5675607c2bfdbb096c0a815025depoger@google.com if (outUni) { 5345f6a00775511b5675607c2bfdbb096c0a815025depoger@google.com *outUni = evt.getFast32(); 5355f6a00775511b5675607c2bfdbb096c0a815025depoger@google.com } 5365f6a00775511b5675607c2bfdbb096c0a815025depoger@google.com return true; 5375f6a00775511b5675607c2bfdbb096c0a815025depoger@google.com } 538908f5836626d792c5e33ad93f44c6a418a0cc8f5epoger@google.com return false; 5395f6a00775511b5675607c2bfdbb096c0a815025depoger@google.com} 5405f6a00775511b5675607c2bfdbb096c0a815025depoger@google.com 5415f6a00775511b5675607c2bfdbb096c0a815025depoger@google.combool SampleCode::KeyQ(const SkEvent& evt, SkKey* outKey) { 5425f6a00775511b5675607c2bfdbb096c0a815025depoger@google.com if (evt.isType(gKeyEvtName, sizeof(gKeyEvtName) - 1)) { 5435f6a00775511b5675607c2bfdbb096c0a815025depoger@google.com if (outKey) { 54409fd4d216963c498c24ba355accce9337a5029a8scroggo@google.com *outKey = (SkKey)evt.getFast32(); 5459875dd14af6d768da8d1a4be58b98fc91ceca0ddtomhudson@google.com } 546aef73617d1bcede80145a13639668f958a3863d8reed@google.com return true; 547de96163a80167636d95837f9ee6a2e98baf9d350epoger@google.com } 5489875dd14af6d768da8d1a4be58b98fc91ceca0ddtomhudson@google.com return false; 549de96163a80167636d95837f9ee6a2e98baf9d350epoger@google.com} 550de96163a80167636d95837f9ee6a2e98baf9d350epoger@google.com 551de96163a80167636d95837f9ee6a2e98baf9d350epoger@google.combool SampleCode::TitleQ(const SkEvent& evt) { 552de96163a80167636d95837f9ee6a2e98baf9d350epoger@google.com return evt.isType(gTitleEvtName, sizeof(gTitleEvtName) - 1); 553aef73617d1bcede80145a13639668f958a3863d8reed@google.com} 554de96163a80167636d95837f9ee6a2e98baf9d350epoger@google.com 555de96163a80167636d95837f9ee6a2e98baf9d350epoger@google.comvoid SampleCode::TitleR(SkEvent* evt, const char title[]) { 556de96163a80167636d95837f9ee6a2e98baf9d350epoger@google.com SkASSERT(evt && TitleQ(*evt)); 557b29c883fb46ac6099440d82ac57b86d25386daedbungeman@google.com evt->setString(gTitleEvtName, title); 5586f6568b27eae62fea23ab8192c6da02ab892bb5eepoger@google.com} 559123ac1d4eab757052407064623643fdc59f85363bsalomon@google.com 5606f6568b27eae62fea23ab8192c6da02ab892bb5eepoger@google.combool SampleCode::RequestTitle(SkView* view, SkString* title) { 5616f6568b27eae62fea23ab8192c6da02ab892bb5eepoger@google.com SkEvent evt(gTitleEvtName); 562de96163a80167636d95837f9ee6a2e98baf9d350epoger@google.com if (view->doQuery(&evt)) { 563de96163a80167636d95837f9ee6a2e98baf9d350epoger@google.com title->set(evt.findString(gTitleEvtName)); 564466f5f3e44e703ca58b43ac1c4ac3bfa0e1ff024commit-bot@chromium.org return true; 565de96163a80167636d95837f9ee6a2e98baf9d350epoger@google.com } 56611db6fa9b9fc30b1f504d9f53e0f6ae7149cc5c5reed@google.com return false; 567de96163a80167636d95837f9ee6a2e98baf9d350epoger@google.com} 568b29c883fb46ac6099440d82ac57b86d25386daedbungeman@google.com 569de96163a80167636d95837f9ee6a2e98baf9d350epoger@google.combool SampleCode::PrefSizeQ(const SkEvent& evt) { 57011db6fa9b9fc30b1f504d9f53e0f6ae7149cc5c5reed@google.com return evt.isType(gPrefSizeEvtName, sizeof(gPrefSizeEvtName) - 1); 57111db6fa9b9fc30b1f504d9f53e0f6ae7149cc5c5reed@google.com} 57211db6fa9b9fc30b1f504d9f53e0f6ae7149cc5c5reed@google.com 573de96163a80167636d95837f9ee6a2e98baf9d350epoger@google.comvoid SampleCode::PrefSizeR(SkEvent* evt, SkScalar width, SkScalar height) { 57411db6fa9b9fc30b1f504d9f53e0f6ae7149cc5c5reed@google.com SkASSERT(evt && PrefSizeQ(*evt)); 575de96163a80167636d95837f9ee6a2e98baf9d350epoger@google.com SkScalar size[2]; 57611db6fa9b9fc30b1f504d9f53e0f6ae7149cc5c5reed@google.com size[0] = width; 577de96163a80167636d95837f9ee6a2e98baf9d350epoger@google.com size[1] = height; 578aef73617d1bcede80145a13639668f958a3863d8reed@google.com evt->setScalars(gPrefSizeEvtName, 2, size); 579de96163a80167636d95837f9ee6a2e98baf9d350epoger@google.com} 580de96163a80167636d95837f9ee6a2e98baf9d350epoger@google.com 581de96163a80167636d95837f9ee6a2e98baf9d350epoger@google.combool SampleCode::FastTextQ(const SkEvent& evt) { 582de96163a80167636d95837f9ee6a2e98baf9d350epoger@google.com return evt.isType(gFastTextEvtName, sizeof(gFastTextEvtName) - 1); 58311db6fa9b9fc30b1f504d9f53e0f6ae7149cc5c5reed@google.com} 584de96163a80167636d95837f9ee6a2e98baf9d350epoger@google.com 58511db6fa9b9fc30b1f504d9f53e0f6ae7149cc5c5reed@google.com/////////////////////////////////////////////////////////////////////////////// 586de96163a80167636d95837f9ee6a2e98baf9d350epoger@google.com 58711db6fa9b9fc30b1f504d9f53e0f6ae7149cc5c5reed@google.comstatic SkMSec gAnimTime; 588de96163a80167636d95837f9ee6a2e98baf9d350epoger@google.comstatic SkMSec gAnimTimePrev; 589aef73617d1bcede80145a13639668f958a3863d8reed@google.com 590de96163a80167636d95837f9ee6a2e98baf9d350epoger@google.comSkMSec SampleCode::GetAnimTime() { return gAnimTime; } 591de96163a80167636d95837f9ee6a2e98baf9d350epoger@google.comSkMSec SampleCode::GetAnimTimeDelta() { return gAnimTime - gAnimTimePrev; } 592de96163a80167636d95837f9ee6a2e98baf9d350epoger@google.comSkScalar SampleCode::GetAnimSecondsDelta() { 593a3264e53ee3f3c5d6a2c813df7e44b5b96d207f2commit-bot@chromium.org return SkDoubleToScalar(GetAnimTimeDelta() / 1000.0); 594de96163a80167636d95837f9ee6a2e98baf9d350epoger@google.com} 595de96163a80167636d95837f9ee6a2e98baf9d350epoger@google.com 596de96163a80167636d95837f9ee6a2e98baf9d350epoger@google.comSkScalar SampleCode::GetAnimScalar(SkScalar speed, SkScalar period) { 5975f6a00775511b5675607c2bfdbb096c0a815025depoger@google.com // since gAnimTime can be up to 32 bits, we can't convert it to a float 5986f6568b27eae62fea23ab8192c6da02ab892bb5eepoger@google.com // or we'll lose the low bits. Hence we use doubles for the intermediate 59946cce91f4859b9c229938d4d649870c0a43b1806reed@google.com // calculations 600de96163a80167636d95837f9ee6a2e98baf9d350epoger@google.com double seconds = (double)gAnimTime / 1000.0; 601de96163a80167636d95837f9ee6a2e98baf9d350epoger@google.com double value = SkScalarToDouble(speed) * seconds; 602c938c48bf426c322e2cb45b4bfaf8a2ee5a2a3c5junov@chromium.org if (period) { 6035a7d029fd6fcdf161b58c09887c6f745c37f1855robertphillips@google.com value = ::fmod(value, SkScalarToDouble(period)); 6045a7d029fd6fcdf161b58c09887c6f745c37f1855robertphillips@google.com } 605de96163a80167636d95837f9ee6a2e98baf9d350epoger@google.com return SkDoubleToScalar(value); 606de96163a80167636d95837f9ee6a2e98baf9d350epoger@google.com} 6075a7d029fd6fcdf161b58c09887c6f745c37f1855robertphillips@google.com 6085a7d029fd6fcdf161b58c09887c6f745c37f1855robertphillips@google.comSkScalar SampleCode::GetAnimSinScalar(SkScalar amplitude, 6095a7d029fd6fcdf161b58c09887c6f745c37f1855robertphillips@google.com SkScalar periodInSec, 6105a7d029fd6fcdf161b58c09887c6f745c37f1855robertphillips@google.com SkScalar phaseInSec) { 6115a7d029fd6fcdf161b58c09887c6f745c37f1855robertphillips@google.com if (!periodInSec) { 612041e2dbc0614e3341e1349fd0e962744a45b6194skia.committer@gmail.com return 0; 6135a7d029fd6fcdf161b58c09887c6f745c37f1855robertphillips@google.com } 6145a7d029fd6fcdf161b58c09887c6f745c37f1855robertphillips@google.com double t = (double)gAnimTime / 1000.0 + phaseInSec; 6155a7d029fd6fcdf161b58c09887c6f745c37f1855robertphillips@google.com t *= SkScalarToFloat(2 * SK_ScalarPI) / periodInSec; 6165a7d029fd6fcdf161b58c09887c6f745c37f1855robertphillips@google.com amplitude = SK_ScalarHalf * amplitude; 6175a7d029fd6fcdf161b58c09887c6f745c37f1855robertphillips@google.com return SkScalarMul(amplitude, SkDoubleToScalar(sin(t))) + amplitude; 6185a7d029fd6fcdf161b58c09887c6f745c37f1855robertphillips@google.com} 6195a7d029fd6fcdf161b58c09887c6f745c37f1855robertphillips@google.com 6205a7d029fd6fcdf161b58c09887c6f745c37f1855robertphillips@google.comenum TilingMode { 6215a7d029fd6fcdf161b58c09887c6f745c37f1855robertphillips@google.com kNo_Tiling, 6225a7d029fd6fcdf161b58c09887c6f745c37f1855robertphillips@google.com kAbs_128x128_Tiling, 6235a7d029fd6fcdf161b58c09887c6f745c37f1855robertphillips@google.com kAbs_256x256_Tiling, 6245a7d029fd6fcdf161b58c09887c6f745c37f1855robertphillips@google.com kRel_4x4_Tiling, 6255a7d029fd6fcdf161b58c09887c6f745c37f1855robertphillips@google.com kRel_1x16_Tiling, 6265a7d029fd6fcdf161b58c09887c6f745c37f1855robertphillips@google.com kRel_16x1_Tiling, 6275a7d029fd6fcdf161b58c09887c6f745c37f1855robertphillips@google.com 6285a7d029fd6fcdf161b58c09887c6f745c37f1855robertphillips@google.com kLast_TilingMode_Enum 629041e2dbc0614e3341e1349fd0e962744a45b6194skia.committer@gmail.com}; 6305a7d029fd6fcdf161b58c09887c6f745c37f1855robertphillips@google.com 6315a7d029fd6fcdf161b58c09887c6f745c37f1855robertphillips@google.comstruct TilingInfo { 6325a7d029fd6fcdf161b58c09887c6f745c37f1855robertphillips@google.com const char* label; 6335a7d029fd6fcdf161b58c09887c6f745c37f1855robertphillips@google.com SkScalar w, h; 6345a7d029fd6fcdf161b58c09887c6f745c37f1855robertphillips@google.com}; 635041e2dbc0614e3341e1349fd0e962744a45b6194skia.committer@gmail.com 636041e2dbc0614e3341e1349fd0e962744a45b6194skia.committer@gmail.comstatic const struct TilingInfo gTilingInfo[] = { 6375a7d029fd6fcdf161b58c09887c6f745c37f1855robertphillips@google.com { "No tiling", SK_Scalar1 , SK_Scalar1 }, // kNo_Tiling 6385a7d029fd6fcdf161b58c09887c6f745c37f1855robertphillips@google.com { "128x128" , SkIntToScalar(128), SkIntToScalar(128) }, // kAbs_128x128_Tiling 6395a7d029fd6fcdf161b58c09887c6f745c37f1855robertphillips@google.com { "256x256" , SkIntToScalar(256), SkIntToScalar(256) }, // kAbs_256x256_Tiling 6405a7d029fd6fcdf161b58c09887c6f745c37f1855robertphillips@google.com { "1/4x1/4" , SK_Scalar1 / 4 , SK_Scalar1 / 4 }, // kRel_4x4_Tiling 6415a7d029fd6fcdf161b58c09887c6f745c37f1855robertphillips@google.com { "1/1x1/16" , SK_Scalar1 , SK_Scalar1 / 16 }, // kRel_1x16_Tiling 6425a7d029fd6fcdf161b58c09887c6f745c37f1855robertphillips@google.com { "1/16x1/1" , SK_Scalar1 / 16 , SK_Scalar1 }, // kRel_16x1_Tiling 6435a7d029fd6fcdf161b58c09887c6f745c37f1855robertphillips@google.com}; 6445a7d029fd6fcdf161b58c09887c6f745c37f1855robertphillips@google.comSK_COMPILE_ASSERT((SK_ARRAY_COUNT(gTilingInfo) == kLast_TilingMode_Enum), 6455a7d029fd6fcdf161b58c09887c6f745c37f1855robertphillips@google.com Incomplete_tiling_labels); 6465a7d029fd6fcdf161b58c09887c6f745c37f1855robertphillips@google.com 6475a7d029fd6fcdf161b58c09887c6f745c37f1855robertphillips@google.comSkSize SampleWindow::tileSize() const { 648b29c883fb46ac6099440d82ac57b86d25386daedbungeman@google.com SkASSERT((TilingMode)fTilingMode < kLast_TilingMode_Enum); 649de96163a80167636d95837f9ee6a2e98baf9d350epoger@google.com const struct TilingInfo* info = gTilingInfo + fTilingMode; 6505e00989a283111cef05bed8102e45c16651e43e4commit-bot@chromium.org return SkSize::Make(info->w > SK_Scalar1 ? info->w : this->width() * info->w, 651de96163a80167636d95837f9ee6a2e98baf9d350epoger@google.com info->h > SK_Scalar1 ? info->h : this->height() * info->h); 652de96163a80167636d95837f9ee6a2e98baf9d350epoger@google.com} 6535e00989a283111cef05bed8102e45c16651e43e4commit-bot@chromium.org////////////////////////////////////////////////////////////////////////////// 6545e00989a283111cef05bed8102e45c16651e43e4commit-bot@chromium.org 65573a7ea3ae0d37ee28f90d6b38c49fda052638253edisonn@google.comstatic SkView* curr_view(SkWindow* wind) { 65673a7ea3ae0d37ee28f90d6b38c49fda052638253edisonn@google.com SkView::F2BIter iter(wind); 65773a7ea3ae0d37ee28f90d6b38c49fda052638253edisonn@google.com return iter.next(); 65873a7ea3ae0d37ee28f90d6b38c49fda052638253edisonn@google.com} 659de96163a80167636d95837f9ee6a2e98baf9d350epoger@google.com 6605e00989a283111cef05bed8102e45c16651e43e4commit-bot@chromium.orgstatic bool curr_title(SkWindow* wind, SkString* title) { 6615e00989a283111cef05bed8102e45c16651e43e4commit-bot@chromium.org SkView* view = curr_view(wind); 6625e00989a283111cef05bed8102e45c16651e43e4commit-bot@chromium.org if (view) { 663de96163a80167636d95837f9ee6a2e98baf9d350epoger@google.com SkEvent evt(gTitleEvtName); 6645e00989a283111cef05bed8102e45c16651e43e4commit-bot@chromium.org if (view->doQuery(&evt)) { 6655e00989a283111cef05bed8102e45c16651e43e4commit-bot@chromium.org title->set(evt.findString(gTitleEvtName)); 6665e00989a283111cef05bed8102e45c16651e43e4commit-bot@chromium.org return true; 6675e00989a283111cef05bed8102e45c16651e43e4commit-bot@chromium.org } 6685e00989a283111cef05bed8102e45c16651e43e4commit-bot@chromium.org } 6695e00989a283111cef05bed8102e45c16651e43e4commit-bot@chromium.org return false; 6705e00989a283111cef05bed8102e45c16651e43e4commit-bot@chromium.org} 6715e00989a283111cef05bed8102e45c16651e43e4commit-bot@chromium.org 6725e00989a283111cef05bed8102e45c16651e43e4commit-bot@chromium.orgvoid SampleWindow::setZoomCenter(float x, float y) 6735e00989a283111cef05bed8102e45c16651e43e4commit-bot@chromium.org{ 6745e00989a283111cef05bed8102e45c16651e43e4commit-bot@chromium.org fZoomCenterX = x; 6755e00989a283111cef05bed8102e45c16651e43e4commit-bot@chromium.org fZoomCenterY = y; 6765e00989a283111cef05bed8102e45c16651e43e4commit-bot@chromium.org} 6775e00989a283111cef05bed8102e45c16651e43e4commit-bot@chromium.org 6785e00989a283111cef05bed8102e45c16651e43e4commit-bot@chromium.orgbool SampleWindow::zoomIn() 6795e00989a283111cef05bed8102e45c16651e43e4commit-bot@chromium.org{ 6805e00989a283111cef05bed8102e45c16651e43e4commit-bot@chromium.org // Arbitrarily decided 6815e00989a283111cef05bed8102e45c16651e43e4commit-bot@chromium.org if (fFatBitsScale == 25) return false; 6825e00989a283111cef05bed8102e45c16651e43e4commit-bot@chromium.org fFatBitsScale++; 6835e00989a283111cef05bed8102e45c16651e43e4commit-bot@chromium.org this->inval(NULL); 6845e00989a283111cef05bed8102e45c16651e43e4commit-bot@chromium.org return true; 6855e00989a283111cef05bed8102e45c16651e43e4commit-bot@chromium.org} 6865e00989a283111cef05bed8102e45c16651e43e4commit-bot@chromium.org 6875e00989a283111cef05bed8102e45c16651e43e4commit-bot@chromium.orgbool SampleWindow::zoomOut() 6885e00989a283111cef05bed8102e45c16651e43e4commit-bot@chromium.org{ 68973a7ea3ae0d37ee28f90d6b38c49fda052638253edisonn@google.com if (fFatBitsScale == 1) return false; 6905e00989a283111cef05bed8102e45c16651e43e4commit-bot@chromium.org fFatBitsScale--; 6915e00989a283111cef05bed8102e45c16651e43e4commit-bot@chromium.org this->inval(NULL); 6925e00989a283111cef05bed8102e45c16651e43e4commit-bot@chromium.org return true; 6935e00989a283111cef05bed8102e45c16651e43e4commit-bot@chromium.org} 6945e00989a283111cef05bed8102e45c16651e43e4commit-bot@chromium.org 6955e00989a283111cef05bed8102e45c16651e43e4commit-bot@chromium.orgvoid SampleWindow::updatePointer(int x, int y) 6965e00989a283111cef05bed8102e45c16651e43e4commit-bot@chromium.org{ 6975e00989a283111cef05bed8102e45c16651e43e4commit-bot@chromium.org fMouseX = x; 6985e00989a283111cef05bed8102e45c16651e43e4commit-bot@chromium.org fMouseY = y; 6999875dd14af6d768da8d1a4be58b98fc91ceca0ddtomhudson@google.com if (fShowZoomer) { 700de96163a80167636d95837f9ee6a2e98baf9d350epoger@google.com this->inval(NULL); 701de96163a80167636d95837f9ee6a2e98baf9d350epoger@google.com } 702de96163a80167636d95837f9ee6a2e98baf9d350epoger@google.com} 703de96163a80167636d95837f9ee6a2e98baf9d350epoger@google.com 704de96163a80167636d95837f9ee6a2e98baf9d350epoger@google.comstatic inline SampleWindow::DeviceType cycle_devicetype(SampleWindow::DeviceType ct) { 705de96163a80167636d95837f9ee6a2e98baf9d350epoger@google.com static const SampleWindow::DeviceType gCT[] = { 706de96163a80167636d95837f9ee6a2e98baf9d350epoger@google.com SampleWindow::kPicture_DeviceType, 707de96163a80167636d95837f9ee6a2e98baf9d350epoger@google.com#if SK_SUPPORT_GPU 708de96163a80167636d95837f9ee6a2e98baf9d350epoger@google.com SampleWindow::kGPU_DeviceType, 709de96163a80167636d95837f9ee6a2e98baf9d350epoger@google.com#if SK_ANGLE 710de96163a80167636d95837f9ee6a2e98baf9d350epoger@google.com SampleWindow::kANGLE_DeviceType, 711de96163a80167636d95837f9ee6a2e98baf9d350epoger@google.com#endif // SK_ANGLE 712de96163a80167636d95837f9ee6a2e98baf9d350epoger@google.com SampleWindow::kRaster_DeviceType, // skip the null gpu device in normal cycling 713de96163a80167636d95837f9ee6a2e98baf9d350epoger@google.com#endif // SK_SUPPORT_GPU 714de96163a80167636d95837f9ee6a2e98baf9d350epoger@google.com SampleWindow::kRaster_DeviceType 715de96163a80167636d95837f9ee6a2e98baf9d350epoger@google.com }; 716de96163a80167636d95837f9ee6a2e98baf9d350epoger@google.com SK_COMPILE_ASSERT(SK_ARRAY_COUNT(gCT) == SampleWindow::kDeviceTypeCnt, array_size_mismatch); 717de96163a80167636d95837f9ee6a2e98baf9d350epoger@google.com return gCT[ct]; 718de96163a80167636d95837f9ee6a2e98baf9d350epoger@google.com} 719aef73617d1bcede80145a13639668f958a3863d8reed@google.com 720de96163a80167636d95837f9ee6a2e98baf9d350epoger@google.comstatic SkString getSampleTitle(const SkViewFactory* sampleFactory) { 721de96163a80167636d95837f9ee6a2e98baf9d350epoger@google.com SkView* view = (*sampleFactory)(); 722de96163a80167636d95837f9ee6a2e98baf9d350epoger@google.com SkString title; 723de96163a80167636d95837f9ee6a2e98baf9d350epoger@google.com SampleCode::RequestTitle(view, &title); 7249875dd14af6d768da8d1a4be58b98fc91ceca0ddtomhudson@google.com view->unref(); 7259875dd14af6d768da8d1a4be58b98fc91ceca0ddtomhudson@google.com return title; 72637269607334b99bf814c7dc6b426745d9b7c7e3fepoger@google.com} 72784a1802b072d76657261eada3018955283ab29d2epoger@google.com 72884a1802b072d76657261eada3018955283ab29d2epoger@google.comstatic bool compareSampleTitle(const SkViewFactory* first, const SkViewFactory* second) { 72984a1802b072d76657261eada3018955283ab29d2epoger@google.com return strcmp(getSampleTitle(first).c_str(), getSampleTitle(second).c_str()) < 0; 73084a1802b072d76657261eada3018955283ab29d2epoger@google.com} 73184a1802b072d76657261eada3018955283ab29d2epoger@google.com 73284a1802b072d76657261eada3018955283ab29d2epoger@google.comDEFINE_string(slide, "", "Start on this sample."); 73384a1802b072d76657261eada3018955283ab29d2epoger@google.comDEFINE_int32(msaa, 0, "Request multisampling with this count."); 73484a1802b072d76657261eada3018955283ab29d2epoger@google.comDEFINE_string(pictureDir, "", "Read pictures from here."); 73584a1802b072d76657261eada3018955283ab29d2epoger@google.comDEFINE_string(picture, "", "Path to single picture."); 73684a1802b072d76657261eada3018955283ab29d2epoger@google.comDEFINE_bool(sort, false, "Sort samples by title."); 7372b3a204bf68c9e41e62e0f2db5dfe263ea811424commit-bot@chromium.orgDEFINE_bool(list, false, "List samples?"); 7382b3a204bf68c9e41e62e0f2db5dfe263ea811424commit-bot@chromium.org#ifdef SAMPLE_PDF_FILE_VIEWER 73984a1802b072d76657261eada3018955283ab29d2epoger@google.comDEFINE_string(pdfPath, "", "Path to direcotry of pdf files."); 74084a1802b072d76657261eada3018955283ab29d2epoger@google.com#endif 74184a1802b072d76657261eada3018955283ab29d2epoger@google.com 74228fcae2ec77eb16a79e155f8d788b20457f1c951commit-bot@chromium.orgSampleWindow::SampleWindow(void* hwnd, int argc, char** argv, DeviceManager* devManager) 74328fcae2ec77eb16a79e155f8d788b20457f1c951commit-bot@chromium.org : INHERITED(hwnd) 7442b3a204bf68c9e41e62e0f2db5dfe263ea811424commit-bot@chromium.org , fDevManager(NULL) { 7452b3a204bf68c9e41e62e0f2db5dfe263ea811424commit-bot@chromium.org 74684a1802b072d76657261eada3018955283ab29d2epoger@google.com SkCommandLineFlags::Parse(argc, argv); 74784a1802b072d76657261eada3018955283ab29d2epoger@google.com 74884a1802b072d76657261eada3018955283ab29d2epoger@google.com fCurrIndex = -1; 74984a1802b072d76657261eada3018955283ab29d2epoger@google.com 75084a1802b072d76657261eada3018955283ab29d2epoger@google.com if (!FLAGS_pictureDir.isEmpty()) { 75184a1802b072d76657261eada3018955283ab29d2epoger@google.com SkOSFile::Iter iter(FLAGS_pictureDir[0], "skp"); 75284a1802b072d76657261eada3018955283ab29d2epoger@google.com SkString filename; 75384a1802b072d76657261eada3018955283ab29d2epoger@google.com while (iter.next(&filename)) { 75484a1802b072d76657261eada3018955283ab29d2epoger@google.com *fSamples.append() = new PictFileFactory( 75584a1802b072d76657261eada3018955283ab29d2epoger@google.com SkOSPath::Join(FLAGS_pictureDir[0], filename.c_str())); 75684a1802b072d76657261eada3018955283ab29d2epoger@google.com } 75784a1802b072d76657261eada3018955283ab29d2epoger@google.com } 75884a1802b072d76657261eada3018955283ab29d2epoger@google.com if (!FLAGS_picture.isEmpty()) { 75984a1802b072d76657261eada3018955283ab29d2epoger@google.com SkString path(FLAGS_picture[0]); 76084a1802b072d76657261eada3018955283ab29d2epoger@google.com fCurrIndex = fSamples.count(); 76184a1802b072d76657261eada3018955283ab29d2epoger@google.com *fSamples.append() = new PictFileFactory(path); 76284a1802b072d76657261eada3018955283ab29d2epoger@google.com } 76384a1802b072d76657261eada3018955283ab29d2epoger@google.com#ifdef SAMPLE_PDF_FILE_VIEWER 76484a1802b072d76657261eada3018955283ab29d2epoger@google.com if (!FLAGS_pdfPath.isEmpty()) { 76584a1802b072d76657261eada3018955283ab29d2epoger@google.com SkOSFile::Iter iter(FLAGS_pdfPath[0], "pdf"); 76684a1802b072d76657261eada3018955283ab29d2epoger@google.com SkString filename; 76784a1802b072d76657261eada3018955283ab29d2epoger@google.com while (iter.next(&filename)) { 76884a1802b072d76657261eada3018955283ab29d2epoger@google.com *fSamples.append() = new PdfFileViewerFactory( 76984a1802b072d76657261eada3018955283ab29d2epoger@google.com SkOSPath::Join(FLAGS_pictureDir[0], filename.c_str())); 77084a1802b072d76657261eada3018955283ab29d2epoger@google.com } 77184a1802b072d76657261eada3018955283ab29d2epoger@google.com } 77284a1802b072d76657261eada3018955283ab29d2epoger@google.com#endif 77384a1802b072d76657261eada3018955283ab29d2epoger@google.com SkGMRegistyToSampleRegistry(); 77484a1802b072d76657261eada3018955283ab29d2epoger@google.com { 77584a1802b072d76657261eada3018955283ab29d2epoger@google.com const SkViewRegister* reg = SkViewRegister::Head(); 7762b3a204bf68c9e41e62e0f2db5dfe263ea811424commit-bot@chromium.org while (reg) { 7772b3a204bf68c9e41e62e0f2db5dfe263ea811424commit-bot@chromium.org *fSamples.append() = reg->factory(); 7782b3a204bf68c9e41e62e0f2db5dfe263ea811424commit-bot@chromium.org reg = reg->next(); 77984a1802b072d76657261eada3018955283ab29d2epoger@google.com } 78084a1802b072d76657261eada3018955283ab29d2epoger@google.com } 78184a1802b072d76657261eada3018955283ab29d2epoger@google.com 782908f5836626d792c5e33ad93f44c6a418a0cc8f5epoger@google.com if (FLAGS_sort) { 7836f6568b27eae62fea23ab8192c6da02ab892bb5eepoger@google.com // Sort samples, so foo.skp and foo.pdf are consecutive and we can quickly spot where 78437269607334b99bf814c7dc6b426745d9b7c7e3fepoger@google.com // skp -> pdf -> png fails. 78537269607334b99bf814c7dc6b426745d9b7c7e3fepoger@google.com SkTQSort(fSamples.begin(), fSamples.end() ? fSamples.end() - 1 : NULL, compareSampleTitle); 78637269607334b99bf814c7dc6b426745d9b7c7e3fepoger@google.com } 7875f99545de67ee729b4b17f1aae56f8c9dcf460f9epoger@google.com 78837269607334b99bf814c7dc6b426745d9b7c7e3fepoger@google.com if (!FLAGS_slide.isEmpty()) { 78937269607334b99bf814c7dc6b426745d9b7c7e3fepoger@google.com fCurrIndex = findByTitle(FLAGS_slide[0]); 7906f7f14d061b045a58a888ee5450b4596797dc453epoger@google.com if (fCurrIndex < 0) { 791659c8c06cdc6c825004515240f81a8dafb2b4b0fepoger@google.com fprintf(stderr, "Unknown sample \"%s\"\n", FLAGS_slide[0]); 792659c8c06cdc6c825004515240f81a8dafb2b4b0fepoger@google.com listTitles(); 79337269607334b99bf814c7dc6b426745d9b7c7e3fepoger@google.com } 79437269607334b99bf814c7dc6b426745d9b7c7e3fepoger@google.com } 795caac3db48f74676889006b5520b766b572b5e9b2epoger@google.com 796caac3db48f74676889006b5520b766b572b5e9b2epoger@google.com fMSAASampleCount = FLAGS_msaa; 797caac3db48f74676889006b5520b766b572b5e9b2epoger@google.com 798caac3db48f74676889006b5520b766b572b5e9b2epoger@google.com if (FLAGS_list) { 799caac3db48f74676889006b5520b766b572b5e9b2epoger@google.com listTitles(); 80037269607334b99bf814c7dc6b426745d9b7c7e3fepoger@google.com } 8016f6568b27eae62fea23ab8192c6da02ab892bb5eepoger@google.com 8026f7f14d061b045a58a888ee5450b4596797dc453epoger@google.com if (fCurrIndex < 0) { 803659c8c06cdc6c825004515240f81a8dafb2b4b0fepoger@google.com SkString title; 804659c8c06cdc6c825004515240f81a8dafb2b4b0fepoger@google.com if (readTitleFromPrefs(&title)) { 805caac3db48f74676889006b5520b766b572b5e9b2epoger@google.com fCurrIndex = findByTitle(title.c_str()); 8066f6568b27eae62fea23ab8192c6da02ab892bb5eepoger@google.com } 807659c8c06cdc6c825004515240f81a8dafb2b4b0fepoger@google.com } 808659c8c06cdc6c825004515240f81a8dafb2b4b0fepoger@google.com 80937269607334b99bf814c7dc6b426745d9b7c7e3fepoger@google.com if (fCurrIndex < 0) { 810ce057fec926f8ec1d60ed4722d1e51a0086e7976epoger@google.com fCurrIndex = 0; 811ce057fec926f8ec1d60ed4722d1e51a0086e7976epoger@google.com } 81237269607334b99bf814c7dc6b426745d9b7c7e3fepoger@google.com 81337269607334b99bf814c7dc6b426745d9b7c7e3fepoger@google.com gSampleWindow = this; 81437269607334b99bf814c7dc6b426745d9b7c7e3fepoger@google.com 8156f6568b27eae62fea23ab8192c6da02ab892bb5eepoger@google.com#ifdef PIPE_FILE 8165f99545de67ee729b4b17f1aae56f8c9dcf460f9epoger@google.com //Clear existing file or create file if it doesn't exist 8175f99545de67ee729b4b17f1aae56f8c9dcf460f9epoger@google.com FILE* f = fopen(FILE_PATH, "wb"); 8185f99545de67ee729b4b17f1aae56f8c9dcf460f9epoger@google.com fclose(f); 8195f99545de67ee729b4b17f1aae56f8c9dcf460f9epoger@google.com#endif 8205f99545de67ee729b4b17f1aae56f8c9dcf460f9epoger@google.com 8215f99545de67ee729b4b17f1aae56f8c9dcf460f9epoger@google.com fDeviceType = kRaster_DeviceType; 8225f99545de67ee729b4b17f1aae56f8c9dcf460f9epoger@google.com 8235f99545de67ee729b4b17f1aae56f8c9dcf460f9epoger@google.com#if DEFAULT_TO_GPU 8245f99545de67ee729b4b17f1aae56f8c9dcf460f9epoger@google.com fDeviceType = kGPU_DeviceType; 8255f99545de67ee729b4b17f1aae56f8c9dcf460f9epoger@google.com#endif 8266f7f14d061b045a58a888ee5450b4596797dc453epoger@google.com#if SK_ANGLE && DEFAULT_TO_ANGLE 827caac3db48f74676889006b5520b766b572b5e9b2epoger@google.com fDeviceType = kANGLE_DeviceType; 828caac3db48f74676889006b5520b766b572b5e9b2epoger@google.com#endif 829caac3db48f74676889006b5520b766b572b5e9b2epoger@google.com 830caac3db48f74676889006b5520b766b572b5e9b2epoger@google.com fUseClip = false; 831caac3db48f74676889006b5520b766b572b5e9b2epoger@google.com fNClip = false; 832caac3db48f74676889006b5520b766b572b5e9b2epoger@google.com fAnimating = false; 833caac3db48f74676889006b5520b766b572b5e9b2epoger@google.com fRotate = false; 834caac3db48f74676889006b5520b766b572b5e9b2epoger@google.com fRotateAnimTime = 0; 83584a1802b072d76657261eada3018955283ab29d2epoger@google.com fPerspAnim = false; 83684a1802b072d76657261eada3018955283ab29d2epoger@google.com fPerspAnimTime = 0; 83784a1802b072d76657261eada3018955283ab29d2epoger@google.com fRequestGrabImage = false; 83837269607334b99bf814c7dc6b426745d9b7c7e3fepoger@google.com fPipeState = SkOSMenu::kOffState; 8396f7f14d061b045a58a888ee5450b4596797dc453epoger@google.com fTilingMode = kNo_Tiling; 8406f7f14d061b045a58a888ee5450b4596797dc453epoger@google.com fMeasureFPS = false; 8416f7f14d061b045a58a888ee5450b4596797dc453epoger@google.com fLCDState = SkOSMenu::kMixedState; 8426f7f14d061b045a58a888ee5450b4596797dc453epoger@google.com fAAState = SkOSMenu::kMixedState; 843de96163a80167636d95837f9ee6a2e98baf9d350epoger@google.com fSubpixelState = SkOSMenu::kMixedState; 84484a1802b072d76657261eada3018955283ab29d2epoger@google.com fHintingState = 0; 84584a1802b072d76657261eada3018955283ab29d2epoger@google.com fFilterLevelIndex = 0; 84684a1802b072d76657261eada3018955283ab29d2epoger@google.com fFlipAxis = 0; 84784a1802b072d76657261eada3018955283ab29d2epoger@google.com fScrollTestX = fScrollTestY = 0; 84884a1802b072d76657261eada3018955283ab29d2epoger@google.com 8496f7f14d061b045a58a888ee5450b4596797dc453epoger@google.com fMouseX = fMouseY = 0; 8506f7f14d061b045a58a888ee5450b4596797dc453epoger@google.com fFatBitsScale = 8; 85184a1802b072d76657261eada3018955283ab29d2epoger@google.com fTypeface = SkTypeface::CreateFromTypeface(NULL, SkTypeface::kBold); 852ee8a8e3931c1d3f39755ee8beaf0c7cb1ba91888epoger@google.com fShowZoomer = false; 85337269607334b99bf814c7dc6b426745d9b7c7e3fepoger@google.com 85437269607334b99bf814c7dc6b426745d9b7c7e3fepoger@google.com fZoomLevel = 0; 8556f7f14d061b045a58a888ee5450b4596797dc453epoger@google.com fZoomScale = SK_Scalar1; 85637269607334b99bf814c7dc6b426745d9b7c7e3fepoger@google.com 85737269607334b99bf814c7dc6b426745d9b7c7e3fepoger@google.com fMagnify = false; 85837269607334b99bf814c7dc6b426745d9b7c7e3fepoger@google.com 85937269607334b99bf814c7dc6b426745d9b7c7e3fepoger@google.com fSaveToPdf = false; 8606f6568b27eae62fea23ab8192c6da02ab892bb5eepoger@google.com fPdfCanvas = NULL; 86137269607334b99bf814c7dc6b426745d9b7c7e3fepoger@google.com 862ee8a8e3931c1d3f39755ee8beaf0c7cb1ba91888epoger@google.com fTransitionNext = 6; 86337269607334b99bf814c7dc6b426745d9b7c7e3fepoger@google.com fTransitionPrev = 2; 8641ddfbc201a5445d2da17d2a087a1ec88cc980ffbepoger@google.com 86576c913db20de7ae1baa49ae66e943bf7f40781ccepoger@google.com int sinkID = this->getSinkID(); 86637269607334b99bf814c7dc6b426745d9b7c7e3fepoger@google.com fAppMenu = new SkOSMenu; 86737269607334b99bf814c7dc6b426745d9b7c7e3fepoger@google.com fAppMenu->setTitle("Global Settings"); 868d4993ff3605102036f83d5834d9a022d780e5488epoger@google.com int itemID; 86976c913db20de7ae1baa49ae66e943bf7f40781ccepoger@google.com 87037269607334b99bf814c7dc6b426745d9b7c7e3fepoger@google.com itemID =fAppMenu->appendList("Device Type", "Device Type", sinkID, 0, 87125c1066e4d23cf7cb1795c78987f4fde08282b46commit-bot@chromium.org "Raster", "Picture", "OpenGL", 872d4993ff3605102036f83d5834d9a022d780e5488epoger@google.com#if SK_ANGLE 8731ddfbc201a5445d2da17d2a087a1ec88cc980ffbepoger@google.com "ANGLE", 8741ddfbc201a5445d2da17d2a087a1ec88cc980ffbepoger@google.com#endif 87576c913db20de7ae1baa49ae66e943bf7f40781ccepoger@google.com NULL); 8761ddfbc201a5445d2da17d2a087a1ec88cc980ffbepoger@google.com fAppMenu->assignKeyEquivalentToItem(itemID, 'd'); 8771ddfbc201a5445d2da17d2a087a1ec88cc980ffbepoger@google.com itemID = fAppMenu->appendTriState("AA", "AA", sinkID, fAAState); 8781ddfbc201a5445d2da17d2a087a1ec88cc980ffbepoger@google.com fAppMenu->assignKeyEquivalentToItem(itemID, 'b'); 8791ddfbc201a5445d2da17d2a087a1ec88cc980ffbepoger@google.com itemID = fAppMenu->appendTriState("LCD", "LCD", sinkID, fLCDState); 88037269607334b99bf814c7dc6b426745d9b7c7e3fepoger@google.com fAppMenu->assignKeyEquivalentToItem(itemID, 'l'); 8811ddfbc201a5445d2da17d2a087a1ec88cc980ffbepoger@google.com itemID = fAppMenu->appendList("FilterLevel", "FilterLevel", sinkID, fFilterLevelIndex, 882ee8a8e3931c1d3f39755ee8beaf0c7cb1ba91888epoger@google.com gFilterLevelStates[0].fName, 8831ddfbc201a5445d2da17d2a087a1ec88cc980ffbepoger@google.com gFilterLevelStates[1].fName, 884ee8a8e3931c1d3f39755ee8beaf0c7cb1ba91888epoger@google.com gFilterLevelStates[2].fName, 8851ddfbc201a5445d2da17d2a087a1ec88cc980ffbepoger@google.com gFilterLevelStates[3].fName, 8861ddfbc201a5445d2da17d2a087a1ec88cc980ffbepoger@google.com gFilterLevelStates[4].fName, 8871ddfbc201a5445d2da17d2a087a1ec88cc980ffbepoger@google.com NULL); 8881ddfbc201a5445d2da17d2a087a1ec88cc980ffbepoger@google.com fAppMenu->assignKeyEquivalentToItem(itemID, 'n'); 8891ddfbc201a5445d2da17d2a087a1ec88cc980ffbepoger@google.com itemID = fAppMenu->appendTriState("Subpixel", "Subpixel", sinkID, fSubpixelState); 8901ddfbc201a5445d2da17d2a087a1ec88cc980ffbepoger@google.com fAppMenu->assignKeyEquivalentToItem(itemID, 's'); 8911ddfbc201a5445d2da17d2a087a1ec88cc980ffbepoger@google.com itemID = fAppMenu->appendList("Hinting", "Hinting", sinkID, fHintingState, 8921ddfbc201a5445d2da17d2a087a1ec88cc980ffbepoger@google.com gHintingStates[0].name, 8931ddfbc201a5445d2da17d2a087a1ec88cc980ffbepoger@google.com gHintingStates[1].name, 8941ddfbc201a5445d2da17d2a087a1ec88cc980ffbepoger@google.com gHintingStates[2].name, 8951ddfbc201a5445d2da17d2a087a1ec88cc980ffbepoger@google.com gHintingStates[3].name, 8961ddfbc201a5445d2da17d2a087a1ec88cc980ffbepoger@google.com gHintingStates[4].name, 8971ddfbc201a5445d2da17d2a087a1ec88cc980ffbepoger@google.com NULL); 8981ddfbc201a5445d2da17d2a087a1ec88cc980ffbepoger@google.com fAppMenu->assignKeyEquivalentToItem(itemID, 'h'); 8991ddfbc201a5445d2da17d2a087a1ec88cc980ffbepoger@google.com 9001ddfbc201a5445d2da17d2a087a1ec88cc980ffbepoger@google.com fUsePipeMenuItemID = fAppMenu->appendTriState("Pipe", "Pipe" , sinkID, 9011ddfbc201a5445d2da17d2a087a1ec88cc980ffbepoger@google.com fPipeState); 902de96163a80167636d95837f9ee6a2e98baf9d350epoger@google.com fAppMenu->assignKeyEquivalentToItem(fUsePipeMenuItemID, 'P'); 90325c1066e4d23cf7cb1795c78987f4fde08282b46commit-bot@chromium.org 90437269607334b99bf814c7dc6b426745d9b7c7e3fepoger@google.com itemID =fAppMenu->appendList("Tiling", "Tiling", sinkID, fTilingMode, 905ee8a8e3931c1d3f39755ee8beaf0c7cb1ba91888epoger@google.com gTilingInfo[kNo_Tiling].label, 90637269607334b99bf814c7dc6b426745d9b7c7e3fepoger@google.com gTilingInfo[kAbs_128x128_Tiling].label, 90737269607334b99bf814c7dc6b426745d9b7c7e3fepoger@google.com gTilingInfo[kAbs_256x256_Tiling].label, 90837269607334b99bf814c7dc6b426745d9b7c7e3fepoger@google.com gTilingInfo[kRel_4x4_Tiling].label, 90937269607334b99bf814c7dc6b426745d9b7c7e3fepoger@google.com gTilingInfo[kRel_1x16_Tiling].label, 91037269607334b99bf814c7dc6b426745d9b7c7e3fepoger@google.com gTilingInfo[kRel_16x1_Tiling].label, 91125c1066e4d23cf7cb1795c78987f4fde08282b46commit-bot@chromium.org NULL); 91276c913db20de7ae1baa49ae66e943bf7f40781ccepoger@google.com fAppMenu->assignKeyEquivalentToItem(itemID, 't'); 91325c1066e4d23cf7cb1795c78987f4fde08282b46commit-bot@chromium.org 9149ef89ce8b7eb270b37941553099654129f2e0a04epoger@google.com itemID = fAppMenu->appendSwitch("Slide Show", "Slide Show" , sinkID, false); 915a243b22422c82def12282f2ea713121716e30621epoger@google.com fAppMenu->assignKeyEquivalentToItem(itemID, 'a'); 91637269607334b99bf814c7dc6b426745d9b7c7e3fepoger@google.com itemID = fAppMenu->appendSwitch("Clip", "Clip" , sinkID, fUseClip); 91737269607334b99bf814c7dc6b426745d9b7c7e3fepoger@google.com fAppMenu->assignKeyEquivalentToItem(itemID, 'c'); 91837269607334b99bf814c7dc6b426745d9b7c7e3fepoger@google.com itemID = fAppMenu->appendSwitch("Flip X", "Flip X" , sinkID, false); 91937269607334b99bf814c7dc6b426745d9b7c7e3fepoger@google.com fAppMenu->assignKeyEquivalentToItem(itemID, 'x'); 92037269607334b99bf814c7dc6b426745d9b7c7e3fepoger@google.com itemID = fAppMenu->appendSwitch("Flip Y", "Flip Y" , sinkID, false); 9218fc3766c58ec879389c3c83c96a73e50ff59eb78vandebo@chromium.org fAppMenu->assignKeyEquivalentToItem(itemID, 'y'); 922e33e137623d56a9d61f00ef74c6ad2e998613062epoger@google.com itemID = fAppMenu->appendSwitch("Zoomer", "Zoomer" , sinkID, fShowZoomer); 923e33e137623d56a9d61f00ef74c6ad2e998613062epoger@google.com fAppMenu->assignKeyEquivalentToItem(itemID, 'z'); 92437269607334b99bf814c7dc6b426745d9b7c7e3fepoger@google.com itemID = fAppMenu->appendSwitch("Magnify", "Magnify" , sinkID, fMagnify); 9256f6568b27eae62fea23ab8192c6da02ab892bb5eepoger@google.com fAppMenu->assignKeyEquivalentToItem(itemID, 'm'); 9268fc3766c58ec879389c3c83c96a73e50ff59eb78vandebo@chromium.org itemID =fAppMenu->appendList("Transition-Next", "Transition-Next", sinkID, 9270dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org fTransitionNext, "Up", "Up and Right", "Right", 928659c8c06cdc6c825004515240f81a8dafb2b4b0fepoger@google.com "Down and Right", "Down", "Down and Left", 929e33e137623d56a9d61f00ef74c6ad2e998613062epoger@google.com "Left", "Up and Left", NULL); 930e33e137623d56a9d61f00ef74c6ad2e998613062epoger@google.com fAppMenu->assignKeyEquivalentToItem(itemID, 'j'); 931e33e137623d56a9d61f00ef74c6ad2e998613062epoger@google.com itemID =fAppMenu->appendList("Transition-Prev", "Transition-Prev", sinkID, 932e33e137623d56a9d61f00ef74c6ad2e998613062epoger@google.com fTransitionPrev, "Up", "Up and Right", "Right", 933e33e137623d56a9d61f00ef74c6ad2e998613062epoger@google.com "Down and Right", "Down", "Down and Left", 9340dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org "Left", "Up and Left", NULL); 935c824c83ec1402e68e827e8920278a86793a12c0cepoger@google.com fAppMenu->assignKeyEquivalentToItem(itemID, 'k'); 936c824c83ec1402e68e827e8920278a86793a12c0cepoger@google.com itemID = fAppMenu->appendAction("Save to PDF", sinkID); 937c824c83ec1402e68e827e8920278a86793a12c0cepoger@google.com fAppMenu->assignKeyEquivalentToItem(itemID, 'e'); 938c824c83ec1402e68e827e8920278a86793a12c0cepoger@google.com 939c824c83ec1402e68e827e8920278a86793a12c0cepoger@google.com this->addMenu(fAppMenu); 940c824c83ec1402e68e827e8920278a86793a12c0cepoger@google.com fSlideMenu = new SkOSMenu; 9410dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org this->addMenu(fSlideMenu); 942e33e137623d56a9d61f00ef74c6ad2e998613062epoger@google.com 943e33e137623d56a9d61f00ef74c6ad2e998613062epoger@google.com this->setColorType(kN32_SkColorType); 94438aeb0fd7a2bdab5e44531d96045dffe25c8e2b0commit-bot@chromium.org this->setVisibleP(true); 9450dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org this->setClipToBounds(false); 9460dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org 9470dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org this->loadView((*fSamples[fCurrIndex])()); 948e33e137623d56a9d61f00ef74c6ad2e998613062epoger@google.com 949e33e137623d56a9d61f00ef74c6ad2e998613062epoger@google.com fPDFData = NULL; 950e33e137623d56a9d61f00ef74c6ad2e998613062epoger@google.com 951e33e137623d56a9d61f00ef74c6ad2e998613062epoger@google.com if (NULL == devManager) { 952e33e137623d56a9d61f00ef74c6ad2e998613062epoger@google.com fDevManager = new DefaultDeviceManager(); 953e33e137623d56a9d61f00ef74c6ad2e998613062epoger@google.com } else { 954e33e137623d56a9d61f00ef74c6ad2e998613062epoger@google.com devManager->ref(); 955e33e137623d56a9d61f00ef74c6ad2e998613062epoger@google.com fDevManager = devManager; 956e33e137623d56a9d61f00ef74c6ad2e998613062epoger@google.com } 957e33e137623d56a9d61f00ef74c6ad2e998613062epoger@google.com fDevManager->setUpBackend(this, fMSAASampleCount); 958e33e137623d56a9d61f00ef74c6ad2e998613062epoger@google.com 959e33e137623d56a9d61f00ef74c6ad2e998613062epoger@google.com // If another constructor set our dimensions, ensure that our 960e33e137623d56a9d61f00ef74c6ad2e998613062epoger@google.com // onSizeChange gets called. 961e33e137623d56a9d61f00ef74c6ad2e998613062epoger@google.com if (this->height() && this->width()) { 962e33e137623d56a9d61f00ef74c6ad2e998613062epoger@google.com this->onSizeChange(); 96338aeb0fd7a2bdab5e44531d96045dffe25c8e2b0commit-bot@chromium.org } 964defc487aa9e6bef16f76846f286f8a1343524d45epoger@google.com 965defc487aa9e6bef16f76846f286f8a1343524d45epoger@google.com // can't call this synchronously, since it may require a subclass to 966e33e137623d56a9d61f00ef74c6ad2e998613062epoger@google.com // to implement, or the caller may need us to have returned from the 96738aeb0fd7a2bdab5e44531d96045dffe25c8e2b0commit-bot@chromium.org // constructor first. Hence we post an event to ourselves. 968e33e137623d56a9d61f00ef74c6ad2e998613062epoger@google.com// this->updateTitle(); 969e33e137623d56a9d61f00ef74c6ad2e998613062epoger@google.com post_event_to_sink(new SkEvent(gUpdateWindowTitleEvtName), this); 970e33e137623d56a9d61f00ef74c6ad2e998613062epoger@google.com} 971e33e137623d56a9d61f00ef74c6ad2e998613062epoger@google.com 972e33e137623d56a9d61f00ef74c6ad2e998613062epoger@google.comSampleWindow::~SampleWindow() { 973e33e137623d56a9d61f00ef74c6ad2e998613062epoger@google.com delete fPdfCanvas; 974e33e137623d56a9d61f00ef74c6ad2e998613062epoger@google.com SkSafeUnref(fTypeface); 9750dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org SkSafeUnref(fDevManager); 976e33e137623d56a9d61f00ef74c6ad2e998613062epoger@google.com} 977de96163a80167636d95837f9ee6a2e98baf9d350epoger@google.com 9786f6568b27eae62fea23ab8192c6da02ab892bb5eepoger@google.com 9799284ccd8bc4e3dfed83485d9fa94ebd69c4b9741epoger@google.comint SampleWindow::findByTitle(const char title[]) { 9809875dd14af6d768da8d1a4be58b98fc91ceca0ddtomhudson@google.com int i, count = fSamples.count(); 98137269607334b99bf814c7dc6b426745d9b7c7e3fepoger@google.com for (i = 0; i < count; i++) { 98237269607334b99bf814c7dc6b426745d9b7c7e3fepoger@google.com if (getSampleTitle(i).equals(title)) { 98337269607334b99bf814c7dc6b426745d9b7c7e3fepoger@google.com return i; 984659c8c06cdc6c825004515240f81a8dafb2b4b0fepoger@google.com } 985659c8c06cdc6c825004515240f81a8dafb2b4b0fepoger@google.com } 98637269607334b99bf814c7dc6b426745d9b7c7e3fepoger@google.com return -1; 98737269607334b99bf814c7dc6b426745d9b7c7e3fepoger@google.com} 98837269607334b99bf814c7dc6b426745d9b7c7e3fepoger@google.com 98937269607334b99bf814c7dc6b426745d9b7c7e3fepoger@google.comvoid SampleWindow::listTitles() { 9906f6568b27eae62fea23ab8192c6da02ab892bb5eepoger@google.com int count = fSamples.count(); 991659c8c06cdc6c825004515240f81a8dafb2b4b0fepoger@google.com SkDebugf("All Slides:\n"); 99237269607334b99bf814c7dc6b426745d9b7c7e3fepoger@google.com for (int i = 0; i < count; i++) { 99337269607334b99bf814c7dc6b426745d9b7c7e3fepoger@google.com SkDebugf(" %s\n", getSampleTitle(i).c_str()); 99437269607334b99bf814c7dc6b426745d9b7c7e3fepoger@google.com } 99584a1802b072d76657261eada3018955283ab29d2epoger@google.com} 9966f7f14d061b045a58a888ee5450b4596797dc453epoger@google.com 9970dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.orgstatic SkBitmap capture_bitmap(SkCanvas* canvas) { 9980dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org SkBitmap bm; 9990dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org if (bm.tryAllocPixels(canvas->imageInfo())) { 10000dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org canvas->readPixels(&bm, 0, 0); 10010dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org } 10020dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org return bm; 10030dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org} 10040dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org 10050dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.orgstatic bool bitmap_diff(SkCanvas* canvas, const SkBitmap& orig, 10060dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org SkBitmap* diff) { 10070dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org SkBitmap src = capture_bitmap(canvas); 10080dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org 10090dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org SkAutoLockPixels alp0(src); 101037269607334b99bf814c7dc6b426745d9b7c7e3fepoger@google.com SkAutoLockPixels alp1(orig); 101137269607334b99bf814c7dc6b426745d9b7c7e3fepoger@google.com for (int y = 0; y < src.height(); y++) { 101220bd04e365ca8f5cdb37068fedd696e783d1a775junov@chromium.org const void* srcP = src.getAddr(0, y); 101320bd04e365ca8f5cdb37068fedd696e783d1a775junov@chromium.org const void* origP = orig.getAddr(0, y); 1014706ff2f4f6f0a46bc50401c0fdd70eb2eaafe2f0junov@chromium.org size_t bytes = src.width() * src.bytesPerPixel(); 1015706ff2f4f6f0a46bc50401c0fdd70eb2eaafe2f0junov@chromium.org if (memcmp(srcP, origP, bytes)) { 1016d8b279926e5d57b2377dac52c3358266733f5820skia.committer@gmail.com SkDebugf("---------- difference on line %d\n", y); 10175fb2ce38b3dcb8e60e9e112df23c9d42456d7069commit-bot@chromium.org return true; 10183cb834bd27a16cc60ff30adae96659558c2dc91fjunov@chromium.org } 10195fb2ce38b3dcb8e60e9e112df23c9d42456d7069commit-bot@chromium.org } 102029b19e53cfac5af4f9bd5d361436d1097f349a34junov@chromium.org return false; 102129b19e53cfac5af4f9bd5d361436d1097f349a34junov@chromium.org} 102229b19e53cfac5af4f9bd5d361436d1097f349a34junov@chromium.org 10235fb2ce38b3dcb8e60e9e112df23c9d42456d7069commit-bot@chromium.orgstatic void drawText(SkCanvas* canvas, SkString string, SkScalar left, SkScalar top, SkPaint& paint) 1024d393b17cf3427bd6f6255f8670067d9aa529e409commit-bot@chromium.org{ 10255fb2ce38b3dcb8e60e9e112df23c9d42456d7069commit-bot@chromium.org SkColor desiredColor = paint.getColor(); 1026d393b17cf3427bd6f6255f8670067d9aa529e409commit-bot@chromium.org paint.setColor(SK_ColorWHITE); 10275fb2ce38b3dcb8e60e9e112df23c9d42456d7069commit-bot@chromium.org const char* c_str = string.c_str(); 102820bd04e365ca8f5cdb37068fedd696e783d1a775junov@chromium.org size_t size = string.size(); 10295fb2ce38b3dcb8e60e9e112df23c9d42456d7069commit-bot@chromium.org SkRect bounds; 10305fb2ce38b3dcb8e60e9e112df23c9d42456d7069commit-bot@chromium.org paint.measureText(c_str, size, &bounds); 1031c938c48bf426c322e2cb45b4bfaf8a2ee5a2a3c5junov@chromium.org bounds.offset(left, top); 1032aef73617d1bcede80145a13639668f958a3863d8reed@google.com SkScalar inset = SkIntToScalar(-2); 103384b18c7e3e042bf206e1ace3d1b6ea5bb929fe51robertphillips@google.com bounds.inset(inset, inset); 1034de96163a80167636d95837f9ee6a2e98baf9d350epoger@google.com canvas->drawRect(bounds, paint); 10359875dd14af6d768da8d1a4be58b98fc91ceca0ddtomhudson@google.com if (desiredColor != SK_ColorBLACK) { 1036de96163a80167636d95837f9ee6a2e98baf9d350epoger@google.com paint.setColor(SK_ColorBLACK); 1037de96163a80167636d95837f9ee6a2e98baf9d350epoger@google.com canvas->drawText(c_str, size, left + SK_Scalar1, top + SK_Scalar1, paint); 1038672588b684d484dce6ae251e9e163e4a46924322reed@google.com } 1039c29f3d8c6dec938fd0599db30cae590fcaa2108bbungeman@google.com paint.setColor(desiredColor); 1040805df1aa1ddba876e6d18f9d2207d04c09415f9dcommit-bot@chromium.org canvas->drawText(c_str, size, left, top, paint); 1041805df1aa1ddba876e6d18f9d2207d04c09415f9dcommit-bot@chromium.org} 1042de96163a80167636d95837f9ee6a2e98baf9d350epoger@google.com 1043de96163a80167636d95837f9ee6a2e98baf9d350epoger@google.com#define XCLIP_N 8 10449875dd14af6d768da8d1a4be58b98fc91ceca0ddtomhudson@google.com#define YCLIP_N 8 1045de96163a80167636d95837f9ee6a2e98baf9d350epoger@google.com 104615655b241bfe1d77032e88115f119684722c10e0epoger@google.comvoid SampleWindow::draw(SkCanvas* canvas) { 10470dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org // update the animation time 10480dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org if (!gAnimTimePrev && !gAnimTime) { 10490dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org // first time make delta be 0 10506f6568b27eae62fea23ab8192c6da02ab892bb5eepoger@google.com gAnimTime = SkTime::GetMSecs(); 1051123ac1d4eab757052407064623643fdc59f85363bsalomon@google.com gAnimTimePrev = gAnimTime; 10526f6568b27eae62fea23ab8192c6da02ab892bb5eepoger@google.com } else { 10530dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org gAnimTimePrev = gAnimTime; 1054de96163a80167636d95837f9ee6a2e98baf9d350epoger@google.com gAnimTime = SkTime::GetMSecs(); 10550dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org } 1056de96163a80167636d95837f9ee6a2e98baf9d350epoger@google.com 1057de96163a80167636d95837f9ee6a2e98baf9d350epoger@google.com if (fGesture.isActive()) { 1058de96163a80167636d95837f9ee6a2e98baf9d350epoger@google.com this->updateMatrix(); 1059de96163a80167636d95837f9ee6a2e98baf9d350epoger@google.com } 10600dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org 10616f6568b27eae62fea23ab8192c6da02ab892bb5eepoger@google.com if (fMeasureFPS) { 106237269607334b99bf814c7dc6b426745d9b7c7e3fepoger@google.com fMeasureFPS_Time = 0; 106337269607334b99bf814c7dc6b426745d9b7c7e3fepoger@google.com } 106437269607334b99bf814c7dc6b426745d9b7c7e3fepoger@google.com 1065de96163a80167636d95837f9ee6a2e98baf9d350epoger@google.com if (fNClip) { 1066de96163a80167636d95837f9ee6a2e98baf9d350epoger@google.com this->INHERITED::draw(canvas); 10670dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org SkBitmap orig = capture_bitmap(canvas); 10680dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org 10698fc3766c58ec879389c3c83c96a73e50ff59eb78vandebo@chromium.org const SkScalar w = this->width(); 10700dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org const SkScalar h = this->height(); 10710dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org const SkScalar cw = w / XCLIP_N; 107238aeb0fd7a2bdab5e44531d96045dffe25c8e2b0commit-bot@chromium.org const SkScalar ch = h / YCLIP_N; 10730dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org for (int y = 0; y < YCLIP_N; y++) { 10740dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org SkRect r; 10750dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org r.fTop = y * ch; 1076de96163a80167636d95837f9ee6a2e98baf9d350epoger@google.com r.fBottom = (y + 1) * ch; 10775e00989a283111cef05bed8102e45c16651e43e4commit-bot@chromium.org if (y == YCLIP_N - 1) { 10785e00989a283111cef05bed8102e45c16651e43e4commit-bot@chromium.org r.fBottom = h; 10795e00989a283111cef05bed8102e45c16651e43e4commit-bot@chromium.org } 10805e00989a283111cef05bed8102e45c16651e43e4commit-bot@chromium.org for (int x = 0; x < XCLIP_N; x++) { 10815e00989a283111cef05bed8102e45c16651e43e4commit-bot@chromium.org SkAutoCanvasRestore acr(canvas, true); 108238aeb0fd7a2bdab5e44531d96045dffe25c8e2b0commit-bot@chromium.org r.fLeft = x * cw; 10835e00989a283111cef05bed8102e45c16651e43e4commit-bot@chromium.org r.fRight = (x + 1) * cw; 10845e00989a283111cef05bed8102e45c16651e43e4commit-bot@chromium.org if (x == XCLIP_N - 1) { 10858fc3766c58ec879389c3c83c96a73e50ff59eb78vandebo@chromium.org r.fRight = w; 10865e00989a283111cef05bed8102e45c16651e43e4commit-bot@chromium.org } 10875e00989a283111cef05bed8102e45c16651e43e4commit-bot@chromium.org canvas->clipRect(r); 10885e00989a283111cef05bed8102e45c16651e43e4commit-bot@chromium.org this->INHERITED::draw(canvas); 1089969967ed68762ab047645a26eab0565eb760709dvandebo@chromium.org } 10905e00989a283111cef05bed8102e45c16651e43e4commit-bot@chromium.org } 10915e00989a283111cef05bed8102e45c16651e43e4commit-bot@chromium.org 10925e00989a283111cef05bed8102e45c16651e43e4commit-bot@chromium.org SkBitmap diff; 10932b3a204bf68c9e41e62e0f2db5dfe263ea811424commit-bot@chromium.org if (bitmap_diff(canvas, orig, &diff)) { 10942b3a204bf68c9e41e62e0f2db5dfe263ea811424commit-bot@chromium.org } 10952b3a204bf68c9e41e62e0f2db5dfe263ea811424commit-bot@chromium.org } else { 10965e00989a283111cef05bed8102e45c16651e43e4commit-bot@chromium.org SkSize tile = this->tileSize(); 10975e00989a283111cef05bed8102e45c16651e43e4commit-bot@chromium.org 10985e00989a283111cef05bed8102e45c16651e43e4commit-bot@chromium.org if (kNo_Tiling == fTilingMode) { 10995e00989a283111cef05bed8102e45c16651e43e4commit-bot@chromium.org this->INHERITED::draw(canvas); // no looping or surfaces needed 11005e00989a283111cef05bed8102e45c16651e43e4commit-bot@chromium.org } else { 11015e00989a283111cef05bed8102e45c16651e43e4commit-bot@chromium.org const int w = SkScalarRoundToInt(tile.width()); 11025e00989a283111cef05bed8102e45c16651e43e4commit-bot@chromium.org const int h = SkScalarRoundToInt(tile.height()); 11035e00989a283111cef05bed8102e45c16651e43e4commit-bot@chromium.org SkImageInfo info = SkImageInfo::MakeN32Premul(w, h); 11045e00989a283111cef05bed8102e45c16651e43e4commit-bot@chromium.org SkAutoTUnref<SkSurface> surface(canvas->newSurface(info)); 11055e00989a283111cef05bed8102e45c16651e43e4commit-bot@chromium.org SkCanvas* tileCanvas = surface->getCanvas(); 11065e00989a283111cef05bed8102e45c16651e43e4commit-bot@chromium.org 11075e00989a283111cef05bed8102e45c16651e43e4commit-bot@chromium.org for (SkScalar y = 0; y < height(); y += tile.height()) { 110838aeb0fd7a2bdab5e44531d96045dffe25c8e2b0commit-bot@chromium.org for (SkScalar x = 0; x < width(); x += tile.width()) { 11095e00989a283111cef05bed8102e45c16651e43e4commit-bot@chromium.org SkAutoCanvasRestore acr(tileCanvas, true); 11105e00989a283111cef05bed8102e45c16651e43e4commit-bot@chromium.org tileCanvas->translate(-x, -y); 11115e00989a283111cef05bed8102e45c16651e43e4commit-bot@chromium.org tileCanvas->clear(0); 11125e00989a283111cef05bed8102e45c16651e43e4commit-bot@chromium.org this->INHERITED::draw(tileCanvas); 11130dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org surface->draw(canvas, x, y, NULL); 11145e00989a283111cef05bed8102e45c16651e43e4commit-bot@chromium.org } 11155e00989a283111cef05bed8102e45c16651e43e4commit-bot@chromium.org } 11160dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org 11170dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org // for drawing the borders between tiles 1118de96163a80167636d95837f9ee6a2e98baf9d350epoger@google.com SkPaint paint; 1119de96163a80167636d95837f9ee6a2e98baf9d350epoger@google.com paint.setColor(0x60FF00FF); 11200dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org paint.setStyle(SkPaint::kStroke_Style); 11210dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org 11220dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org for (SkScalar y = 0; y < height(); y += tile.height()) { 11238fc3766c58ec879389c3c83c96a73e50ff59eb78vandebo@chromium.org for (SkScalar x = 0; x < width(); x += tile.width()) { 1124e33e137623d56a9d61f00ef74c6ad2e998613062epoger@google.com canvas->drawRect(SkRect::MakeXYWH(x, y, tile.width(), tile.height()), paint); 11250dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org } 112638aeb0fd7a2bdab5e44531d96045dffe25c8e2b0commit-bot@chromium.org } 11270dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org } 11280dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org } 1129e33e137623d56a9d61f00ef74c6ad2e998613062epoger@google.com if (fShowZoomer && !fSaveToPdf) { 11300dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org showZoomer(canvas); 1131de96163a80167636d95837f9ee6a2e98baf9d350epoger@google.com } 11320dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org if (fMagnify && !fSaveToPdf) { 11339875dd14af6d768da8d1a4be58b98fc91ceca0ddtomhudson@google.com magnify(canvas); 11349875dd14af6d768da8d1a4be58b98fc91ceca0ddtomhudson@google.com } 11356f6568b27eae62fea23ab8192c6da02ab892bb5eepoger@google.com 11366f6568b27eae62fea23ab8192c6da02ab892bb5eepoger@google.com if (fMeasureFPS && fMeasureFPS_Time) { 11376f6568b27eae62fea23ab8192c6da02ab892bb5eepoger@google.com this->updateTitle(); 1138123ac1d4eab757052407064623643fdc59f85363bsalomon@google.com this->postInvalDelay(); 1139de96163a80167636d95837f9ee6a2e98baf9d350epoger@google.com } 1140de96163a80167636d95837f9ee6a2e98baf9d350epoger@google.com 1141c8263e704135436f71a585801966294d6deadeebepoger@google.com // do this last 1142de96163a80167636d95837f9ee6a2e98baf9d350epoger@google.com fDevManager->publishCanvas(fDeviceType, canvas, this); 1143de96163a80167636d95837f9ee6a2e98baf9d350epoger@google.com} 1144de96163a80167636d95837f9ee6a2e98baf9d350epoger@google.com 1145123ac1d4eab757052407064623643fdc59f85363bsalomon@google.comstatic float clipW = 200; 11466f6568b27eae62fea23ab8192c6da02ab892bb5eepoger@google.comstatic float clipH = 200; 11476f6568b27eae62fea23ab8192c6da02ab892bb5eepoger@google.comvoid SampleWindow::magnify(SkCanvas* canvas) { 11486f6568b27eae62fea23ab8192c6da02ab892bb5eepoger@google.com SkRect r; 11496f6568b27eae62fea23ab8192c6da02ab892bb5eepoger@google.com int count = canvas->save(); 11506f6568b27eae62fea23ab8192c6da02ab892bb5eepoger@google.com 11516f6568b27eae62fea23ab8192c6da02ab892bb5eepoger@google.com SkMatrix m = canvas->getTotalMatrix(); 11526f6568b27eae62fea23ab8192c6da02ab892bb5eepoger@google.com if (!m.invert(&m)) { 11536f6568b27eae62fea23ab8192c6da02ab892bb5eepoger@google.com return; 11546f6568b27eae62fea23ab8192c6da02ab892bb5eepoger@google.com } 11556f6568b27eae62fea23ab8192c6da02ab892bb5eepoger@google.com SkPoint offset, center; 11566f6568b27eae62fea23ab8192c6da02ab892bb5eepoger@google.com SkScalar mouseX = fMouseX * SK_Scalar1; 11576f6568b27eae62fea23ab8192c6da02ab892bb5eepoger@google.com SkScalar mouseY = fMouseY * SK_Scalar1; 1158310478e72c63e639373465216271b81f1e4a9136epoger@google.com m.mapXY(mouseX - clipW/2, mouseY - clipH/2, &offset); 1159310478e72c63e639373465216271b81f1e4a9136epoger@google.com m.mapXY(mouseX, mouseY, ¢er); 11606f6568b27eae62fea23ab8192c6da02ab892bb5eepoger@google.com 1161de96163a80167636d95837f9ee6a2e98baf9d350epoger@google.com r.set(0, 0, clipW * m.getScaleX(), clipH * m.getScaleX()); 116237269607334b99bf814c7dc6b426745d9b7c7e3fepoger@google.com r.offset(offset.fX, offset.fY); 116338aeb0fd7a2bdab5e44531d96045dffe25c8e2b0commit-bot@chromium.org 11644370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com SkPaint paint; 11656f6568b27eae62fea23ab8192c6da02ab892bb5eepoger@google.com paint.setColor(0xFF66AAEE); 11664370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com paint.setStyle(SkPaint::kStroke_Style); 11674370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com paint.setStrokeWidth(10.f * m.getScaleX()); 1168caac3db48f74676889006b5520b766b572b5e9b2epoger@google.com //lense offset 1169caac3db48f74676889006b5520b766b572b5e9b2epoger@google.com //canvas->translate(0, -250); 117038aeb0fd7a2bdab5e44531d96045dffe25c8e2b0commit-bot@chromium.org canvas->drawRect(r, paint); 1171659c8c06cdc6c825004515240f81a8dafb2b4b0fepoger@google.com canvas->clipRect(r); 11726f6568b27eae62fea23ab8192c6da02ab892bb5eepoger@google.com 1173de96163a80167636d95837f9ee6a2e98baf9d350epoger@google.com m = canvas->getTotalMatrix(); 1174c8263e704135436f71a585801966294d6deadeebepoger@google.com m.setTranslate(-center.fX, -center.fY); 1175c8263e704135436f71a585801966294d6deadeebepoger@google.com m.postScale(0.5f * fFatBitsScale, 0.5f * fFatBitsScale); 1176c8263e704135436f71a585801966294d6deadeebepoger@google.com m.postTranslate(center.fX, center.fY); 1177805df1aa1ddba876e6d18f9d2207d04c09415f9dcommit-bot@chromium.org canvas->concat(m); 1178805df1aa1ddba876e6d18f9d2207d04c09415f9dcommit-bot@chromium.org 1179805df1aa1ddba876e6d18f9d2207d04c09415f9dcommit-bot@chromium.org this->INHERITED::draw(canvas); 1180659c8c06cdc6c825004515240f81a8dafb2b4b0fepoger@google.com 1181c8263e704135436f71a585801966294d6deadeebepoger@google.com canvas->restoreToCount(count); 1182c8263e704135436f71a585801966294d6deadeebepoger@google.com} 1183c8263e704135436f71a585801966294d6deadeebepoger@google.com 1184c8263e704135436f71a585801966294d6deadeebepoger@google.comvoid SampleWindow::showZoomer(SkCanvas* canvas) { 1185c8263e704135436f71a585801966294d6deadeebepoger@google.com int count = canvas->save(); 1186c8263e704135436f71a585801966294d6deadeebepoger@google.com canvas->resetMatrix(); 1187c8263e704135436f71a585801966294d6deadeebepoger@google.com // Ensure the mouse position is on screen. 1188c8263e704135436f71a585801966294d6deadeebepoger@google.com int width = SkScalarRoundToInt(this->width()); 118974b7ffda687c66d46ac3cfa4f2baedd4c62e3fbescroggo@google.com int height = SkScalarRoundToInt(this->height()); 119074b7ffda687c66d46ac3cfa4f2baedd4c62e3fbescroggo@google.com if (fMouseX >= width) fMouseX = width - 1; 119174b7ffda687c66d46ac3cfa4f2baedd4c62e3fbescroggo@google.com else if (fMouseX < 0) fMouseX = 0; 1192c8263e704135436f71a585801966294d6deadeebepoger@google.com if (fMouseY >= height) fMouseY = height - 1; 1193c8263e704135436f71a585801966294d6deadeebepoger@google.com else if (fMouseY < 0) fMouseY = 0; 1194aef2d3b14eab4f86e7d0efef952e64b3546630acscroggo@google.com 1195aef2d3b14eab4f86e7d0efef952e64b3546630acscroggo@google.com SkBitmap bitmap = capture_bitmap(canvas); 1196c8263e704135436f71a585801966294d6deadeebepoger@google.com bitmap.lockPixels(); 1197c8263e704135436f71a585801966294d6deadeebepoger@google.com 1198c8263e704135436f71a585801966294d6deadeebepoger@google.com // Find the size of the zoomed in view, forced to be odd, so the examined pixel is in the middle. 1199c8263e704135436f71a585801966294d6deadeebepoger@google.com int zoomedWidth = (width >> 1) | 1; 1200c8263e704135436f71a585801966294d6deadeebepoger@google.com int zoomedHeight = (height >> 1) | 1; 1201c8263e704135436f71a585801966294d6deadeebepoger@google.com SkIRect src; 120238aeb0fd7a2bdab5e44531d96045dffe25c8e2b0commit-bot@chromium.org src.set(0, 0, zoomedWidth / fFatBitsScale, zoomedHeight / fFatBitsScale); 1203659c8c06cdc6c825004515240f81a8dafb2b4b0fepoger@google.com src.offset(fMouseX - (src.width()>>1), fMouseY - (src.height()>>1)); 1204c8263e704135436f71a585801966294d6deadeebepoger@google.com SkRect dest; 1205c8263e704135436f71a585801966294d6deadeebepoger@google.com dest.set(0, 0, SkIntToScalar(zoomedWidth), SkIntToScalar(zoomedHeight)); 1206c8263e704135436f71a585801966294d6deadeebepoger@google.com dest.offset(SkIntToScalar(width - zoomedWidth), SkIntToScalar(height - zoomedHeight)); 1207de96163a80167636d95837f9ee6a2e98baf9d350epoger@google.com SkPaint paint; 1208565254bc9343d0befdfbbb97a3dc6d44c6e18658scroggo@google.com // Clear the background behind our zoomed in view 1209de96163a80167636d95837f9ee6a2e98baf9d350epoger@google.com paint.setColor(SK_ColorWHITE); 1210565254bc9343d0befdfbbb97a3dc6d44c6e18658scroggo@google.com canvas->drawRect(dest, paint); 12115af9b2032b552516c9223d9fb22185b022b13c62scroggo@google.com canvas->drawBitmapRect(bitmap, &src, dest); 12126f6568b27eae62fea23ab8192c6da02ab892bb5eepoger@google.com paint.setColor(SK_ColorBLACK); 12136f6568b27eae62fea23ab8192c6da02ab892bb5eepoger@google.com paint.setStyle(SkPaint::kStroke_Style); 121438aeb0fd7a2bdab5e44531d96045dffe25c8e2b0commit-bot@chromium.org // Draw a border around the pixel in the middle 1215659c8c06cdc6c825004515240f81a8dafb2b4b0fepoger@google.com SkRect originalPixel; 12166f6568b27eae62fea23ab8192c6da02ab892bb5eepoger@google.com originalPixel.set(SkIntToScalar(fMouseX), SkIntToScalar(fMouseY), SkIntToScalar(fMouseX + 1), SkIntToScalar(fMouseY + 1)); 1217de96163a80167636d95837f9ee6a2e98baf9d350epoger@google.com SkMatrix matrix; 1218c8263e704135436f71a585801966294d6deadeebepoger@google.com SkRect scalarSrc; 1219c8263e704135436f71a585801966294d6deadeebepoger@google.com scalarSrc.set(src); 1220c8263e704135436f71a585801966294d6deadeebepoger@google.com SkColor color = bitmap.getColor(fMouseX, fMouseY); 1221c8263e704135436f71a585801966294d6deadeebepoger@google.com if (matrix.setRectToRect(scalarSrc, dest, SkMatrix::kFill_ScaleToFit)) { 1222c8263e704135436f71a585801966294d6deadeebepoger@google.com SkRect pixel; 1223659c8c06cdc6c825004515240f81a8dafb2b4b0fepoger@google.com matrix.mapRect(&pixel, originalPixel); 1224c8263e704135436f71a585801966294d6deadeebepoger@google.com // TODO Perhaps measure the values and make the outline white if it's "dark" 1225c8263e704135436f71a585801966294d6deadeebepoger@google.com if (color == SK_ColorBLACK) { 1226c8263e704135436f71a585801966294d6deadeebepoger@google.com paint.setColor(SK_ColorWHITE); 1227c8263e704135436f71a585801966294d6deadeebepoger@google.com } 1228c8263e704135436f71a585801966294d6deadeebepoger@google.com canvas->drawRect(pixel, paint); 1229c8263e704135436f71a585801966294d6deadeebepoger@google.com } 1230c8263e704135436f71a585801966294d6deadeebepoger@google.com paint.setColor(SK_ColorBLACK); 1231c8263e704135436f71a585801966294d6deadeebepoger@google.com // Draw a border around the destination rectangle 123274b7ffda687c66d46ac3cfa4f2baedd4c62e3fbescroggo@google.com canvas->drawRect(dest, paint); 1233c8263e704135436f71a585801966294d6deadeebepoger@google.com paint.setStyle(SkPaint::kStrokeAndFill_Style); 1234c8263e704135436f71a585801966294d6deadeebepoger@google.com // Identify the pixel and its color on screen 1235aef2d3b14eab4f86e7d0efef952e64b3546630acscroggo@google.com paint.setTypeface(fTypeface); 1236aef2d3b14eab4f86e7d0efef952e64b3546630acscroggo@google.com paint.setAntiAlias(true); 1237c8263e704135436f71a585801966294d6deadeebepoger@google.com SkScalar lineHeight = paint.getFontMetrics(NULL); 1238c8263e704135436f71a585801966294d6deadeebepoger@google.com SkString string; 1239c8263e704135436f71a585801966294d6deadeebepoger@google.com string.appendf("(%i, %i)", fMouseX, fMouseY); 124038aeb0fd7a2bdab5e44531d96045dffe25c8e2b0commit-bot@chromium.org SkScalar left = dest.fLeft + SkIntToScalar(3); 1241c8263e704135436f71a585801966294d6deadeebepoger@google.com SkScalar i = SK_Scalar1; 1242c8263e704135436f71a585801966294d6deadeebepoger@google.com drawText(canvas, string, left, SkScalarMulAdd(lineHeight, i, dest.fTop), paint); 1243c8263e704135436f71a585801966294d6deadeebepoger@google.com // Alpha 1244c8263e704135436f71a585801966294d6deadeebepoger@google.com i += SK_Scalar1; 1245c8263e704135436f71a585801966294d6deadeebepoger@google.com string.reset(); 1246de96163a80167636d95837f9ee6a2e98baf9d350epoger@google.com string.appendf("A: %X", SkColorGetA(color)); 1247565254bc9343d0befdfbbb97a3dc6d44c6e18658scroggo@google.com drawText(canvas, string, left, SkScalarMulAdd(lineHeight, i, dest.fTop), paint); 1248de96163a80167636d95837f9ee6a2e98baf9d350epoger@google.com // Red 1249565254bc9343d0befdfbbb97a3dc6d44c6e18658scroggo@google.com i += SK_Scalar1; 1250e8ebeb1f8fde6525bbab988c6090a5d3ab19855bepoger@google.com string.reset(); 1251e8ebeb1f8fde6525bbab988c6090a5d3ab19855bepoger@google.com string.appendf("R: %X", SkColorGetR(color)); 1252e8ebeb1f8fde6525bbab988c6090a5d3ab19855bepoger@google.com paint.setColor(SK_ColorRED); 1253e8ebeb1f8fde6525bbab988c6090a5d3ab19855bepoger@google.com drawText(canvas, string, left, SkScalarMulAdd(lineHeight, i, dest.fTop), paint); 1254e8ebeb1f8fde6525bbab988c6090a5d3ab19855bepoger@google.com // Green 1255e8ebeb1f8fde6525bbab988c6090a5d3ab19855bepoger@google.com i += SK_Scalar1; 12566f7f14d061b045a58a888ee5450b4596797dc453epoger@google.com string.reset(); 12575079d2c2a0dc0deacecccc6ef9d1c45c6c7982e4epoger@google.com string.appendf("G: %X", SkColorGetG(color)); 12583e62ebf93b43139202ce803245411467c7ed13ffcommit-bot@chromium.org paint.setColor(SK_ColorGREEN); 1259e8ebeb1f8fde6525bbab988c6090a5d3ab19855bepoger@google.com drawText(canvas, string, left, SkScalarMulAdd(lineHeight, i, dest.fTop), paint); 126095146ebc43175ae0c1cd3a116509d92aa1a445abjunov@chromium.org // Blue 12615f99545de67ee729b4b17f1aae56f8c9dcf460f9epoger@google.com i += SK_Scalar1; 126295146ebc43175ae0c1cd3a116509d92aa1a445abjunov@chromium.org string.reset(); 1263310478e72c63e639373465216271b81f1e4a9136epoger@google.com string.appendf("B: %X", SkColorGetB(color)); 1264310478e72c63e639373465216271b81f1e4a9136epoger@google.com paint.setColor(SK_ColorBLUE); 126585195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org drawText(canvas, string, left, SkScalarMulAdd(lineHeight, i, dest.fTop), paint); 1266310478e72c63e639373465216271b81f1e4a9136epoger@google.com canvas->restoreToCount(count); 1267310478e72c63e639373465216271b81f1e4a9136epoger@google.com} 126857f7abc8659f17e58fc2d1410117033ad524f9d3epoger@google.com 1269908f5836626d792c5e33ad93f44c6a418a0cc8f5epoger@google.comvoid SampleWindow::onDraw(SkCanvas* canvas) { 127037269607334b99bf814c7dc6b426745d9b7c7e3fepoger@google.com} 127137269607334b99bf814c7dc6b426745d9b7c7e3fepoger@google.com 127237269607334b99bf814c7dc6b426745d9b7c7e3fepoger@google.com#include "SkColorPriv.h" 127325c1066e4d23cf7cb1795c78987f4fde08282b46commit-bot@chromium.org 127437269607334b99bf814c7dc6b426745d9b7c7e3fepoger@google.comvoid SampleWindow::saveToPdf() 1275ee8a8e3931c1d3f39755ee8beaf0c7cb1ba91888epoger@google.com{ 1276ee8a8e3931c1d3f39755ee8beaf0c7cb1ba91888epoger@google.com fSaveToPdf = true; 1277ee8a8e3931c1d3f39755ee8beaf0c7cb1ba91888epoger@google.com this->inval(NULL); 12789c56a8dea6587242671fb36db3940277db6018dbepoger@google.com} 1279ee8a8e3931c1d3f39755ee8beaf0c7cb1ba91888epoger@google.com 128025c1066e4d23cf7cb1795c78987f4fde08282b46commit-bot@chromium.orgSkCanvas* SampleWindow::beforeChildren(SkCanvas* canvas) { 1281de96163a80167636d95837f9ee6a2e98baf9d350epoger@google.com if (fSaveToPdf) { 128272c9672ce274a3b6cb40800d66374edf25b157a3scroggo@google.com const SkBitmap bmp = capture_bitmap(canvas); 1283cf8fb1f6f03fc77f9927564f9ef9abeeeec508d2bsalomon@google.com SkISize size = SkISize::Make(bmp.width(), bmp.height()); 1284cf8fb1f6f03fc77f9927564f9ef9abeeeec508d2bsalomon@google.com SkPDFDevice* pdfDevice = new SkPDFDevice(size, size, 1285cf8fb1f6f03fc77f9927564f9ef9abeeeec508d2bsalomon@google.com canvas->getTotalMatrix()); 1286cf8fb1f6f03fc77f9927564f9ef9abeeeec508d2bsalomon@google.com fPdfCanvas = new SkCanvas(pdfDevice); 1287cf8fb1f6f03fc77f9927564f9ef9abeeeec508d2bsalomon@google.com pdfDevice->unref(); 12887361f54294d65a5c42ce5cf1cd56d0fd7122e268bsalomon@google.com canvas = fPdfCanvas; 12899875dd14af6d768da8d1a4be58b98fc91ceca0ddtomhudson@google.com } else if (kPicture_DeviceType == fDeviceType) { 12904c75f241cb75f202cfa51569ba8dc4749a28a9f7bsalomon@google.com canvas = fRecorder.beginRecording(9999, 9999, NULL, 0); 129169dc4ffa6f461d85b6323d3ec4ef574ff5ff1f59reed@google.com } else { 12924c75f241cb75f202cfa51569ba8dc4749a28a9f7bsalomon@google.com#if SK_SUPPORT_GPU 1293a73e860923885ae05ae794b40e7e3fe0b1bd8478robertphillips@google.com if (kNullGPU_DeviceType != fDeviceType) 12944c75f241cb75f202cfa51569ba8dc4749a28a9f7bsalomon@google.com#endif 12954c75f241cb75f202cfa51569ba8dc4749a28a9f7bsalomon@google.com { 12964c75f241cb75f202cfa51569ba8dc4749a28a9f7bsalomon@google.com canvas = this->INHERITED::beforeChildren(canvas); 12977bb28a1679d5d0c07e4cdf983316417cffdc4197robertphillips@google.com } 12984c75f241cb75f202cfa51569ba8dc4749a28a9f7bsalomon@google.com } 1299440ddf433b176aca51a2e1335d9f00039a947a0bcommit-bot@chromium.org 1300440ddf433b176aca51a2e1335d9f00039a947a0bcommit-bot@chromium.org if (fUseClip) { 1301c824c83ec1402e68e827e8920278a86793a12c0cepoger@google.com canvas->drawColor(0xFFFF88FF); 1302c824c83ec1402e68e827e8920278a86793a12c0cepoger@google.com canvas->clipPath(fClipPath, SkRegion::kIntersect_Op, true); 1303515dcd36032997ce335daa0163c6d67e851bcad1commit-bot@chromium.org } 1304d6543e5edae5d2fe9f364a563f41c1654b14e5f4robertphillips@google.com 1305d6543e5edae5d2fe9f364a563f41c1654b14e5f4robertphillips@google.com return canvas; 1306d6543e5edae5d2fe9f364a563f41c1654b14e5f4robertphillips@google.com} 1307d6543e5edae5d2fe9f364a563f41c1654b14e5f4robertphillips@google.com 1308515dcd36032997ce335daa0163c6d67e851bcad1commit-bot@chromium.org#include "SkData.h" 1309cf8fb1f6f03fc77f9927564f9ef9abeeeec508d2bsalomon@google.comvoid SampleWindow::afterChildren(SkCanvas* orig) { 13104c75f241cb75f202cfa51569ba8dc4749a28a9f7bsalomon@google.com if (fSaveToPdf) { 13114c75f241cb75f202cfa51569ba8dc4749a28a9f7bsalomon@google.com fSaveToPdf = false; 1312cf8fb1f6f03fc77f9927564f9ef9abeeeec508d2bsalomon@google.com if (fShowZoomer) { 1313cf8fb1f6f03fc77f9927564f9ef9abeeeec508d2bsalomon@google.com showZoomer(fPdfCanvas); 13144c75f241cb75f202cfa51569ba8dc4749a28a9f7bsalomon@google.com } 1315cf8fb1f6f03fc77f9927564f9ef9abeeeec508d2bsalomon@google.com SkString name; 13164c75f241cb75f202cfa51569ba8dc4749a28a9f7bsalomon@google.com name.printf("%s.pdf", this->getTitle()); 1317b29c883fb46ac6099440d82ac57b86d25386daedbungeman@google.com SkPDFDocument doc; 13187361f54294d65a5c42ce5cf1cd56d0fd7122e268bsalomon@google.com SkPDFDevice* device = NULL;//static_cast<SkPDFDevice*>(fPdfCanvas->getDevice()); 13194c75f241cb75f202cfa51569ba8dc4749a28a9f7bsalomon@google.com SkASSERT(false); 1320a73e860923885ae05ae794b40e7e3fe0b1bd8478robertphillips@google.com doc.appendPage(device); 13217361f54294d65a5c42ce5cf1cd56d0fd7122e268bsalomon@google.com#ifdef SK_BUILD_FOR_ANDROID 13220dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org name.prepend("/sdcard/"); 1323cf8fb1f6f03fc77f9927564f9ef9abeeeec508d2bsalomon@google.com#endif 132400dae86f5872b60927b28a32b375bc01cd7c61c9reed@android.com 132500dae86f5872b60927b28a32b375bc01cd7c61c9reed@android.com#ifdef SK_BUILD_FOR_IOS 13265d20caea15b574c9027ea4e695a03c4402e1d832bungeman@google.com SkDynamicMemoryWStream mstream; 13275d20caea15b574c9027ea4e695a03c4402e1d832bungeman@google.com doc.emitPDF(&mstream); 13280dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org fPDFData = mstream.copyToData(); 13290dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org#endif 13300dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org SkFILEWStream stream(name.c_str()); 13310dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org if (stream.isValid()) { 13320dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org doc.emitPDF(&stream); 13330dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org const char* desc = "File saved from Skia SampleApp"; 13340dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org this->onPDFSaved(this->getTitle(), desc, name.c_str()); 1335ffd178c84d85a12016d844d1b9b3fe2172e32a74commit-bot@chromium.org } 1336ffd178c84d85a12016d844d1b9b3fe2172e32a74commit-bot@chromium.org 1337ffd178c84d85a12016d844d1b9b3fe2172e32a74commit-bot@chromium.org delete fPdfCanvas; 13385d20caea15b574c9027ea4e695a03c4402e1d832bungeman@google.com fPdfCanvas = NULL; 13395d20caea15b574c9027ea4e695a03c4402e1d832bungeman@google.com 13400dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org // We took over the draw calls in order to create the PDF, so we need 13410dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org // to redraw. 1342dd8e353bef35b2656b83499289b409af3b0e3f10bsalomon@google.com this->inval(NULL); 1343dd8e353bef35b2656b83499289b409af3b0e3f10bsalomon@google.com return; 1344dd8e353bef35b2656b83499289b409af3b0e3f10bsalomon@google.com } 134509fd4d216963c498c24ba355accce9337a5029a8scroggo@google.com 13460f567c6cb6944d0fc1ce18214c3459ba6b23fdf0scroggo@google.com if (fRequestGrabImage) { 13470f567c6cb6944d0fc1ce18214c3459ba6b23fdf0scroggo@google.com fRequestGrabImage = false; 13485867c0f03262a3ce11c6790d5bd75ce0ebcb197cscroggo@google.com 1349dd8e353bef35b2656b83499289b409af3b0e3f10bsalomon@google.com SkBitmap bmp = capture_bitmap(orig); 13505867c0f03262a3ce11c6790d5bd75ce0ebcb197cscroggo@google.com if (!bmp.isNull()) { 13510f567c6cb6944d0fc1ce18214c3459ba6b23fdf0scroggo@google.com static int gSampleGrabCounter; 13525867c0f03262a3ce11c6790d5bd75ce0ebcb197cscroggo@google.com SkString name; 135309fd4d216963c498c24ba355accce9337a5029a8scroggo@google.com name.printf("sample_grab_%d.png", gSampleGrabCounter++); 13545867c0f03262a3ce11c6790d5bd75ce0ebcb197cscroggo@google.com SkImageEncoder::EncodeFile(name.c_str(), bmp, 13550f567c6cb6944d0fc1ce18214c3459ba6b23fdf0scroggo@google.com SkImageEncoder::kPNG_Type, 100); 13560f567c6cb6944d0fc1ce18214c3459ba6b23fdf0scroggo@google.com } 1357dd8e353bef35b2656b83499289b409af3b0e3f10bsalomon@google.com } 1358dd8e353bef35b2656b83499289b409af3b0e3f10bsalomon@google.com 1359dd8e353bef35b2656b83499289b409af3b0e3f10bsalomon@google.com if (kPicture_DeviceType == fDeviceType) { 13600f567c6cb6944d0fc1ce18214c3459ba6b23fdf0scroggo@google.com SkAutoTUnref<const SkPicture> picture(fRecorder.endRecording()); 13610f567c6cb6944d0fc1ce18214c3459ba6b23fdf0scroggo@google.com 13620f567c6cb6944d0fc1ce18214c3459ba6b23fdf0scroggo@google.com if (true) { 13630f567c6cb6944d0fc1ce18214c3459ba6b23fdf0scroggo@google.com this->installDrawFilter(orig); 13640f567c6cb6944d0fc1ce18214c3459ba6b23fdf0scroggo@google.com orig->drawPicture(picture); 1365dd8e353bef35b2656b83499289b409af3b0e3f10bsalomon@google.com } else if (true) { 1366dd8e353bef35b2656b83499289b409af3b0e3f10bsalomon@google.com SkDynamicMemoryWStream ostream; 1367dd8e353bef35b2656b83499289b409af3b0e3f10bsalomon@google.com picture->serialize(&ostream); 1368dd8e353bef35b2656b83499289b409af3b0e3f10bsalomon@google.com 1369dd8e353bef35b2656b83499289b409af3b0e3f10bsalomon@google.com SkAutoDataUnref data(ostream.copyToData()); 1370dd8e353bef35b2656b83499289b409af3b0e3f10bsalomon@google.com SkMemoryStream istream(data->data(), data->size()); 1371dd8e353bef35b2656b83499289b409af3b0e3f10bsalomon@google.com SkAutoTUnref<SkPicture> pict(SkPicture::CreateFromStream(&istream)); 1372dd8e353bef35b2656b83499289b409af3b0e3f10bsalomon@google.com if (pict.get() != NULL) { 1373dd8e353bef35b2656b83499289b409af3b0e3f10bsalomon@google.com orig->drawPicture(pict.get()); 1374dd8e353bef35b2656b83499289b409af3b0e3f10bsalomon@google.com } 1375dd8e353bef35b2656b83499289b409af3b0e3f10bsalomon@google.com } else { 13760f567c6cb6944d0fc1ce18214c3459ba6b23fdf0scroggo@google.com picture->playback(orig); 13770f567c6cb6944d0fc1ce18214c3459ba6b23fdf0scroggo@google.com } 1378dd8e353bef35b2656b83499289b409af3b0e3f10bsalomon@google.com } 1379dd8e353bef35b2656b83499289b409af3b0e3f10bsalomon@google.com 1380dd8e353bef35b2656b83499289b409af3b0e3f10bsalomon@google.com // Do this after presentGL and other finishing, rather than in afterChild 1381dd8e353bef35b2656b83499289b409af3b0e3f10bsalomon@google.com if (fMeasureFPS && fMeasureFPS_StartTime) { 1382dd8e353bef35b2656b83499289b409af3b0e3f10bsalomon@google.com fMeasureFPS_Time += SkTime::GetMSecs() - fMeasureFPS_StartTime; 1383dd8e353bef35b2656b83499289b409af3b0e3f10bsalomon@google.com } 1384dd8e353bef35b2656b83499289b409af3b0e3f10bsalomon@google.com} 1385dd8e353bef35b2656b83499289b409af3b0e3f10bsalomon@google.com 1386dd8e353bef35b2656b83499289b409af3b0e3f10bsalomon@google.comvoid SampleWindow::beforeChild(SkView* child, SkCanvas* canvas) { 1387dd8e353bef35b2656b83499289b409af3b0e3f10bsalomon@google.com if (fRotate) { 1388dd8e353bef35b2656b83499289b409af3b0e3f10bsalomon@google.com fRotateAnimTime += SampleCode::GetAnimSecondsDelta(); 1389dd8e353bef35b2656b83499289b409af3b0e3f10bsalomon@google.com 139009fd4d216963c498c24ba355accce9337a5029a8scroggo@google.com SkScalar cx = this->width() / 2; 139109fd4d216963c498c24ba355accce9337a5029a8scroggo@google.com SkScalar cy = this->height() / 2; 139209fd4d216963c498c24ba355accce9337a5029a8scroggo@google.com canvas->translate(cx, cy); 13930dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org canvas->rotate(fRotateAnimTime * 10); 13940dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org canvas->translate(-cx, -cy); 13950dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org } 13960dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org 13970dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org if (fPerspAnim) { 13980dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org fPerspAnimTime += SampleCode::GetAnimSecondsDelta(); 13990dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org 14000dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org static const SkScalar gAnimPeriod = 10 * SK_Scalar1; 14010dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org static const SkScalar gAnimMag = SK_Scalar1 / 1000; 14020dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org SkScalar t = SkScalarMod(fPerspAnimTime, gAnimPeriod); 14030dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org if (SkScalarFloorToInt(SkScalarDiv(fPerspAnimTime, gAnimPeriod)) & 0x1) { 14040dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org t = gAnimPeriod - t; 14050dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org } 14060dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org t = 2 * t - gAnimPeriod; 14070dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org t = SkScalarMul(SkScalarDiv(t, gAnimPeriod), gAnimMag); 14080dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org SkMatrix m; 14090dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org m.reset(); 14100dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org#if 1 14110dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org m.setPerspY(t); 14120dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org#else 14130dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org m.setPerspY(SK_Scalar1 / 1000); 14140dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org m.setSkewX(SkScalarDiv(8, 25)); 14150dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org m.dump(); 14160dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org#endif 14170dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org canvas->concat(m); 14180dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org } 14196f6568b27eae62fea23ab8192c6da02ab892bb5eepoger@google.com 14206f6568b27eae62fea23ab8192c6da02ab892bb5eepoger@google.com this->installDrawFilter(canvas); 14216f6568b27eae62fea23ab8192c6da02ab892bb5eepoger@google.com 14226f6568b27eae62fea23ab8192c6da02ab892bb5eepoger@google.com if (fMeasureFPS) { 14236f6568b27eae62fea23ab8192c6da02ab892bb5eepoger@google.com if (SampleView::SetRepeatDraw(child, FPS_REPEAT_COUNT)) { 14246f6568b27eae62fea23ab8192c6da02ab892bb5eepoger@google.com fMeasureFPS_StartTime = SkTime::GetMSecs(); 14257d519305bb52eadf6b8265c6720642193791a364scroggo@google.com } 14260f567c6cb6944d0fc1ce18214c3459ba6b23fdf0scroggo@google.com } else { 1427f8afb2bd5853f9d66448ba1f23251f8c93340bf6vandebo@chromium.org (void)SampleView::SetRepeatDraw(child, 1); 14285e49738c99f573b2e5ba342f6ec8bfa3bcf125e4epoger@google.com } 1429b17ccc992da94e55cef07cedf5491911d78dfa3fcommit-bot@chromium.org if (fPerspAnim || fRotate) { 143009fd4d216963c498c24ba355accce9337a5029a8scroggo@google.com this->inval(NULL); 143109fd4d216963c498c24ba355accce9337a5029a8scroggo@google.com } 14320b735631b7d22316693629a4110c7e95b2a7633escroggo@google.com} 143309fd4d216963c498c24ba355accce9337a5029a8scroggo@google.com 14346f6568b27eae62fea23ab8192c6da02ab892bb5eepoger@google.comvoid SampleWindow::afterChild(SkView* child, SkCanvas* canvas) { 14356f6568b27eae62fea23ab8192c6da02ab892bb5eepoger@google.com canvas->setDrawFilter(NULL); 14360b735631b7d22316693629a4110c7e95b2a7633escroggo@google.com} 143709fd4d216963c498c24ba355accce9337a5029a8scroggo@google.com 143809fd4d216963c498c24ba355accce9337a5029a8scroggo@google.comstatic SkColorType gColorTypeCycle[] = { 14395079d2c2a0dc0deacecccc6ef9d1c45c6c7982e4epoger@google.com kUnknown_SkColorType, // none -> none 14405079d2c2a0dc0deacecccc6ef9d1c45c6c7982e4epoger@google.com kUnknown_SkColorType, // a8 -> none 14415079d2c2a0dc0deacecccc6ef9d1c45c6c7982e4epoger@google.com kN32_SkColorType, // 565 -> 8888 1442f711f320a34216fc9f64839b90b99a1492c54e09epoger@google.com kN32_SkColorType, // 4444 -> 8888 1443f711f320a34216fc9f64839b90b99a1492c54e09epoger@google.com kRGB_565_SkColorType, // 8888 -> 565 1444f711f320a34216fc9f64839b90b99a1492c54e09epoger@google.com kRGB_565_SkColorType, // 8888 -> 565 14456dda827913a3dbdb84934f4f1d79c0b702169e5ccommit-bot@chromium.org kUnknown_SkColorType, // index8 -> none 1446512c9b65fc9fd6d298892719aeda2a8bcd377ac5caryclark@google.com}; 1447512c9b65fc9fd6d298892719aeda2a8bcd377ac5caryclark@google.com 1448512c9b65fc9fd6d298892719aeda2a8bcd377ac5caryclark@google.comstatic SkColorType cycle_colortypes(SkColorType c) { 1449512c9b65fc9fd6d298892719aeda2a8bcd377ac5caryclark@google.com return gColorTypeCycle[c]; 1450512c9b65fc9fd6d298892719aeda2a8bcd377ac5caryclark@google.com} 1451512c9b65fc9fd6d298892719aeda2a8bcd377ac5caryclark@google.com 1452512c9b65fc9fd6d298892719aeda2a8bcd377ac5caryclark@google.comvoid SampleWindow::changeZoomLevel(float delta) { 1453512c9b65fc9fd6d298892719aeda2a8bcd377ac5caryclark@google.com fZoomLevel += delta; 14545f99545de67ee729b4b17f1aae56f8c9dcf460f9epoger@google.com if (fZoomLevel > 0) { 14555f99545de67ee729b4b17f1aae56f8c9dcf460f9epoger@google.com fZoomLevel = SkMinScalar(fZoomLevel, MAX_ZOOM_LEVEL); 145609fd4d216963c498c24ba355accce9337a5029a8scroggo@google.com fZoomScale = fZoomLevel + SK_Scalar1; 145709fd4d216963c498c24ba355accce9337a5029a8scroggo@google.com } else if (fZoomLevel < 0) { 145809fd4d216963c498c24ba355accce9337a5029a8scroggo@google.com fZoomLevel = SkMaxScalar(fZoomLevel, MIN_ZOOM_LEVEL); 145909fd4d216963c498c24ba355accce9337a5029a8scroggo@google.com fZoomScale = SK_Scalar1 / (SK_Scalar1 - fZoomLevel); 14605e49738c99f573b2e5ba342f6ec8bfa3bcf125e4epoger@google.com } else { 1461d393b17cf3427bd6f6255f8670067d9aa529e409commit-bot@chromium.org fZoomScale = SK_Scalar1; 146209fd4d216963c498c24ba355accce9337a5029a8scroggo@google.com } 146309fd4d216963c498c24ba355accce9337a5029a8scroggo@google.com this->updateMatrix(); 14645e49738c99f573b2e5ba342f6ec8bfa3bcf125e4epoger@google.com} 1465ac8f3a4f133d059c74ea20c106b963235ee6e48edjsollen@google.com 1466ac8f3a4f133d059c74ea20c106b963235ee6e48edjsollen@google.comvoid SampleWindow::updateMatrix(){ 1467ac8f3a4f133d059c74ea20c106b963235ee6e48edjsollen@google.com SkMatrix m; 1468725a64cf89605680ebb0f56cd6727f29d8b9899btfarina@chromium.org m.reset(); 14695e49738c99f573b2e5ba342f6ec8bfa3bcf125e4epoger@google.com if (fZoomLevel) { 14705e49738c99f573b2e5ba342f6ec8bfa3bcf125e4epoger@google.com SkPoint center; 1471caac3db48f74676889006b5520b766b572b5e9b2epoger@google.com //m = this->getLocalMatrix();//.invert(&m); 147209fd4d216963c498c24ba355accce9337a5029a8scroggo@google.com m.mapXY(fZoomCenterX, fZoomCenterY, ¢er); 14735e49738c99f573b2e5ba342f6ec8bfa3bcf125e4epoger@google.com SkScalar cx = center.fX; 147409fd4d216963c498c24ba355accce9337a5029a8scroggo@google.com SkScalar cy = center.fY; 147509fd4d216963c498c24ba355accce9337a5029a8scroggo@google.com 1476b0f8b430de74a51f35dbfbff5284a04f8d70ec48epoger@google.com m.setTranslate(-cx, -cy); 1477b0f8b430de74a51f35dbfbff5284a04f8d70ec48epoger@google.com m.postScale(fZoomScale, fZoomScale); 14786f7f14d061b045a58a888ee5450b4596797dc453epoger@google.com m.postTranslate(cx, cy); 14796f7f14d061b045a58a888ee5450b4596797dc453epoger@google.com } 148025c1066e4d23cf7cb1795c78987f4fde08282b46commit-bot@chromium.org 14816f7f14d061b045a58a888ee5450b4596797dc453epoger@google.com if (fFlipAxis) { 148225c1066e4d23cf7cb1795c78987f4fde08282b46commit-bot@chromium.org m.preTranslate(fZoomCenterX, fZoomCenterY); 148309fd4d216963c498c24ba355accce9337a5029a8scroggo@google.com if (fFlipAxis & kFlipAxis_X) { 1484604e0c249ef0e11a1b8bc41195081363fd86d892scroggo@google.com m.preScale(-SK_Scalar1, SK_Scalar1); 1485d9dfa18372119c8e1318125d2075fa80e0819094edisonn@google.com } 1486d9dfa18372119c8e1318125d2075fa80e0819094edisonn@google.com if (fFlipAxis & kFlipAxis_Y) { 1487d9dfa18372119c8e1318125d2075fa80e0819094edisonn@google.com m.preScale(SK_Scalar1, -SK_Scalar1); 1488f4f9df4c193620167dc6f202f1b72245f4a260cdcommit-bot@chromium.org } 1489f4f9df4c193620167dc6f202f1b72245f4a260cdcommit-bot@chromium.org m.preTranslate(-fZoomCenterX, -fZoomCenterY); 1490f4f9df4c193620167dc6f202f1b72245f4a260cdcommit-bot@chromium.org //canvas->concat(m); 1491f4f9df4c193620167dc6f202f1b72245f4a260cdcommit-bot@chromium.org } 1492f4f9df4c193620167dc6f202f1b72245f4a260cdcommit-bot@chromium.org // Apply any gesture matrix 1493f4f9df4c193620167dc6f202f1b72245f4a260cdcommit-bot@chromium.org m.preConcat(fGesture.localM()); 1494f4f9df4c193620167dc6f202f1b72245f4a260cdcommit-bot@chromium.org m.preConcat(fGesture.globalM()); 14955e00989a283111cef05bed8102e45c16651e43e4commit-bot@chromium.org 149673a7ea3ae0d37ee28f90d6b38c49fda052638253edisonn@google.com this->setLocalMatrix(m); 149773a7ea3ae0d37ee28f90d6b38c49fda052638253edisonn@google.com 149873a7ea3ae0d37ee28f90d6b38c49fda052638253edisonn@google.com this->updateTitle(); 149973a7ea3ae0d37ee28f90d6b38c49fda052638253edisonn@google.com this->inval(NULL); 1500672588b684d484dce6ae251e9e163e4a46924322reed@google.com} 1501d9dfa18372119c8e1318125d2075fa80e0819094edisonn@google.combool SampleWindow::previousSample() { 1502608ea6508ae2e9ea05ea863ba50fc27d44d2eae9commit-bot@chromium.org fCurrIndex = (fCurrIndex - 1 + fSamples.count()) % fSamples.count(); 1503608ea6508ae2e9ea05ea863ba50fc27d44d2eae9commit-bot@chromium.org this->loadView(create_transition(curr_view(this), (*fSamples[fCurrIndex])(), 1504d9dfa18372119c8e1318125d2075fa80e0819094edisonn@google.com fTransitionPrev)); 1505608ea6508ae2e9ea05ea863ba50fc27d44d2eae9commit-bot@chromium.org return true; 1506d9dfa18372119c8e1318125d2075fa80e0819094edisonn@google.com} 1507d9dfa18372119c8e1318125d2075fa80e0819094edisonn@google.com 1508d9dfa18372119c8e1318125d2075fa80e0819094edisonn@google.combool SampleWindow::nextSample() { 1509d9dfa18372119c8e1318125d2075fa80e0819094edisonn@google.com fCurrIndex = (fCurrIndex + 1) % fSamples.count(); 1510d5f032d46baa42f836d06d7372fba8f022a20dfacommit-bot@chromium.org this->loadView(create_transition(curr_view(this), (*fSamples[fCurrIndex])(), 1511608ea6508ae2e9ea05ea863ba50fc27d44d2eae9commit-bot@chromium.org fTransitionNext)); 1512d9dfa18372119c8e1318125d2075fa80e0819094edisonn@google.com return true; 1513d9dfa18372119c8e1318125d2075fa80e0819094edisonn@google.com} 1514608ea6508ae2e9ea05ea863ba50fc27d44d2eae9commit-bot@chromium.org 1515608ea6508ae2e9ea05ea863ba50fc27d44d2eae9commit-bot@chromium.orgbool SampleWindow::goToSample(int i) { 1516608ea6508ae2e9ea05ea863ba50fc27d44d2eae9commit-bot@chromium.org fCurrIndex = (i) % fSamples.count(); 1517608ea6508ae2e9ea05ea863ba50fc27d44d2eae9commit-bot@chromium.org this->loadView(create_transition(curr_view(this),(*fSamples[fCurrIndex])(), 6)); 1518608ea6508ae2e9ea05ea863ba50fc27d44d2eae9commit-bot@chromium.org return true; 1519608ea6508ae2e9ea05ea863ba50fc27d44d2eae9commit-bot@chromium.org} 1520608ea6508ae2e9ea05ea863ba50fc27d44d2eae9commit-bot@chromium.org 1521608ea6508ae2e9ea05ea863ba50fc27d44d2eae9commit-bot@chromium.orgSkString SampleWindow::getSampleTitle(int i) { 1522608ea6508ae2e9ea05ea863ba50fc27d44d2eae9commit-bot@chromium.org return ::getSampleTitle(fSamples[i]); 1523608ea6508ae2e9ea05ea863ba50fc27d44d2eae9commit-bot@chromium.org} 1524608ea6508ae2e9ea05ea863ba50fc27d44d2eae9commit-bot@chromium.org 1525d9dfa18372119c8e1318125d2075fa80e0819094edisonn@google.comint SampleWindow::sampleCount() { 15267d519305bb52eadf6b8265c6720642193791a364scroggo@google.com return fSamples.count(); 15275867c0f03262a3ce11c6790d5bd75ce0ebcb197cscroggo@google.com} 15285867c0f03262a3ce11c6790d5bd75ce0ebcb197cscroggo@google.com 15295867c0f03262a3ce11c6790d5bd75ce0ebcb197cscroggo@google.comvoid SampleWindow::showOverview() { 153009fd4d216963c498c24ba355accce9337a5029a8scroggo@google.com this->loadView(create_transition(curr_view(this), 15315867c0f03262a3ce11c6790d5bd75ce0ebcb197cscroggo@google.com create_overview(fSamples.count(), fSamples.begin()), 15325867c0f03262a3ce11c6790d5bd75ce0ebcb197cscroggo@google.com 4)); 15335867c0f03262a3ce11c6790d5bd75ce0ebcb197cscroggo@google.com} 15345867c0f03262a3ce11c6790d5bd75ce0ebcb197cscroggo@google.com 15355867c0f03262a3ce11c6790d5bd75ce0ebcb197cscroggo@google.comvoid SampleWindow::installDrawFilter(SkCanvas* canvas) { 15360dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org canvas->setDrawFilter(new FlagsDrawFilter(fLCDState, fAAState, fSubpixelState, 15370dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org fHintingState, fFilterLevelIndex))->unref(); 15380dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org} 15390dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org 15400dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.orgvoid SampleWindow::postAnimatingEvent() { 15410dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org if (fAnimating) { 15420dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org (new SkEvent(ANIMATING_EVENTTYPE, this->getSinkID()))->postDelay(ANIMATING_DELAY); 15430dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org } 15440dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org} 1545fb2cd425c2271c3d42c9667753b33ae71f05ef1breed@google.com 1546fb2cd425c2271c3d42c9667753b33ae71f05ef1breed@google.combool SampleWindow::onEvent(const SkEvent& evt) { 1547fb2cd425c2271c3d42c9667753b33ae71f05ef1breed@google.com if (evt.isType(gUpdateWindowTitleEvtName)) { 1548fb2cd425c2271c3d42c9667753b33ae71f05ef1breed@google.com this->updateTitle(); 1549fb2cd425c2271c3d42c9667753b33ae71f05ef1breed@google.com return true; 1550fb2cd425c2271c3d42c9667753b33ae71f05ef1breed@google.com } 1551fb2cd425c2271c3d42c9667753b33ae71f05ef1breed@google.com if (evt.isType(ANIMATING_EVENTTYPE)) { 155280724dfeb320d1152128cd33636c9024952432d3epoger@google.com if (fAnimating) { 155380724dfeb320d1152128cd33636c9024952432d3epoger@google.com this->nextSample(); 155480724dfeb320d1152128cd33636c9024952432d3epoger@google.com this->postAnimatingEvent(); 155580724dfeb320d1152128cd33636c9024952432d3epoger@google.com } 155680724dfeb320d1152128cd33636c9024952432d3epoger@google.com return true; 155780724dfeb320d1152128cd33636c9024952432d3epoger@google.com } 155880724dfeb320d1152128cd33636c9024952432d3epoger@google.com if (evt.isType("replace-transition-view")) { 15596f6568b27eae62fea23ab8192c6da02ab892bb5eepoger@google.com this->loadView((SkView*)SkEventSink::FindSink(evt.getFast32())); 15606f6568b27eae62fea23ab8192c6da02ab892bb5eepoger@google.com return true; 15616f6568b27eae62fea23ab8192c6da02ab892bb5eepoger@google.com } 15626f6568b27eae62fea23ab8192c6da02ab892bb5eepoger@google.com if (evt.isType("set-curr-index")) { 15636f6568b27eae62fea23ab8192c6da02ab892bb5eepoger@google.com this->goToSample(evt.getFast32()); 15646f6568b27eae62fea23ab8192c6da02ab892bb5eepoger@google.com return true; 15656f6568b27eae62fea23ab8192c6da02ab892bb5eepoger@google.com } 156680724dfeb320d1152128cd33636c9024952432d3epoger@google.com if (isInvalEvent(evt)) { 156738aeb0fd7a2bdab5e44531d96045dffe25c8e2b0commit-bot@chromium.org this->inval(NULL); 1568659c8c06cdc6c825004515240f81a8dafb2b4b0fepoger@google.com return true; 1569c8263e704135436f71a585801966294d6deadeebepoger@google.com } 1570c8263e704135436f71a585801966294d6deadeebepoger@google.com int selected = -1; 1571c8263e704135436f71a585801966294d6deadeebepoger@google.com if (SkOSMenu::FindListIndex(evt, "Device Type", &selected)) { 1572c8263e704135436f71a585801966294d6deadeebepoger@google.com this->setDeviceType((DeviceType)selected); 1573c8263e704135436f71a585801966294d6deadeebepoger@google.com return true; 1574c8263e704135436f71a585801966294d6deadeebepoger@google.com } 1575659c8c06cdc6c825004515240f81a8dafb2b4b0fepoger@google.com if (SkOSMenu::FindTriState(evt, "Pipe", &fPipeState)) { 1576659c8c06cdc6c825004515240f81a8dafb2b4b0fepoger@google.com#ifdef PIPE_NET 1577c8263e704135436f71a585801966294d6deadeebepoger@google.com if (!fPipeState != SkOSMenu::kOnState) 1578c8263e704135436f71a585801966294d6deadeebepoger@google.com gServer.disconnectAll(); 157980724dfeb320d1152128cd33636c9024952432d3epoger@google.com#endif 158080724dfeb320d1152128cd33636c9024952432d3epoger@google.com (void)SampleView::SetUsePipe(curr_view(this), fPipeState); 1581c8263e704135436f71a585801966294d6deadeebepoger@google.com this->updateTitle(); 158238aeb0fd7a2bdab5e44531d96045dffe25c8e2b0commit-bot@chromium.org this->inval(NULL); 1583659c8c06cdc6c825004515240f81a8dafb2b4b0fepoger@google.com return true; 158480724dfeb320d1152128cd33636c9024952432d3epoger@google.com } 1585c8263e704135436f71a585801966294d6deadeebepoger@google.com if (SkOSMenu::FindSwitchState(evt, "Slide Show", NULL)) { 158680724dfeb320d1152128cd33636c9024952432d3epoger@google.com this->toggleSlideshow(); 1587c8263e704135436f71a585801966294d6deadeebepoger@google.com return true; 1588c8263e704135436f71a585801966294d6deadeebepoger@google.com } 1589c8263e704135436f71a585801966294d6deadeebepoger@google.com if (SkOSMenu::FindTriState(evt, "AA", &fAAState) || 1590659c8c06cdc6c825004515240f81a8dafb2b4b0fepoger@google.com SkOSMenu::FindTriState(evt, "LCD", &fLCDState) || 1591659c8c06cdc6c825004515240f81a8dafb2b4b0fepoger@google.com SkOSMenu::FindListIndex(evt, "FilterLevel", &fFilterLevelIndex) || 1592c8263e704135436f71a585801966294d6deadeebepoger@google.com SkOSMenu::FindTriState(evt, "Subpixel", &fSubpixelState) || 1593c8263e704135436f71a585801966294d6deadeebepoger@google.com SkOSMenu::FindListIndex(evt, "Hinting", &fHintingState) || 159480724dfeb320d1152128cd33636c9024952432d3epoger@google.com SkOSMenu::FindSwitchState(evt, "Clip", &fUseClip) || 159580724dfeb320d1152128cd33636c9024952432d3epoger@google.com SkOSMenu::FindSwitchState(evt, "Zoomer", &fShowZoomer) || 159680724dfeb320d1152128cd33636c9024952432d3epoger@google.com SkOSMenu::FindSwitchState(evt, "Magnify", &fMagnify) || 159780724dfeb320d1152128cd33636c9024952432d3epoger@google.com SkOSMenu::FindListIndex(evt, "Transition-Next", &fTransitionNext) || 1598c8263e704135436f71a585801966294d6deadeebepoger@google.com SkOSMenu::FindListIndex(evt, "Transition-Prev", &fTransitionPrev)) { 159938aeb0fd7a2bdab5e44531d96045dffe25c8e2b0commit-bot@chromium.org this->inval(NULL); 1600659c8c06cdc6c825004515240f81a8dafb2b4b0fepoger@google.com this->updateTitle(); 160180724dfeb320d1152128cd33636c9024952432d3epoger@google.com return true; 160280724dfeb320d1152128cd33636c9024952432d3epoger@google.com } 160380724dfeb320d1152128cd33636c9024952432d3epoger@google.com if (SkOSMenu::FindListIndex(evt, "Tiling", &fTilingMode)) { 1604c8263e704135436f71a585801966294d6deadeebepoger@google.com if (SampleView::IsSampleView(curr_view(this))) { 1605c8263e704135436f71a585801966294d6deadeebepoger@google.com ((SampleView*)curr_view(this))->onTileSizeChanged(this->tileSize()); 1606c8263e704135436f71a585801966294d6deadeebepoger@google.com } 1607659c8c06cdc6c825004515240f81a8dafb2b4b0fepoger@google.com this->inval(NULL); 1608659c8c06cdc6c825004515240f81a8dafb2b4b0fepoger@google.com this->updateTitle(); 1609659c8c06cdc6c825004515240f81a8dafb2b4b0fepoger@google.com return true; 1610659c8c06cdc6c825004515240f81a8dafb2b4b0fepoger@google.com } 1611659c8c06cdc6c825004515240f81a8dafb2b4b0fepoger@google.com if (SkOSMenu::FindSwitchState(evt, "Flip X", NULL)) { 1612659c8c06cdc6c825004515240f81a8dafb2b4b0fepoger@google.com fFlipAxis ^= kFlipAxis_X; 1613659c8c06cdc6c825004515240f81a8dafb2b4b0fepoger@google.com this->updateMatrix(); 161438aeb0fd7a2bdab5e44531d96045dffe25c8e2b0commit-bot@chromium.org return true; 1615659c8c06cdc6c825004515240f81a8dafb2b4b0fepoger@google.com } 1616c8263e704135436f71a585801966294d6deadeebepoger@google.com if (SkOSMenu::FindSwitchState(evt, "Flip Y", NULL)) { 1617c8263e704135436f71a585801966294d6deadeebepoger@google.com fFlipAxis ^= kFlipAxis_Y; 161880724dfeb320d1152128cd33636c9024952432d3epoger@google.com this->updateMatrix(); 161980724dfeb320d1152128cd33636c9024952432d3epoger@google.com return true; 1620c8263e704135436f71a585801966294d6deadeebepoger@google.com } 1621c8263e704135436f71a585801966294d6deadeebepoger@google.com if (SkOSMenu::FindAction(evt,"Save to PDF")) { 1622d393b17cf3427bd6f6255f8670067d9aa529e409commit-bot@chromium.org this->saveToPdf(); 1623d393b17cf3427bd6f6255f8670067d9aa529e409commit-bot@chromium.org return true; 1624d393b17cf3427bd6f6255f8670067d9aa529e409commit-bot@chromium.org } 1625d393b17cf3427bd6f6255f8670067d9aa529e409commit-bot@chromium.org return this->INHERITED::onEvent(evt); 1626d393b17cf3427bd6f6255f8670067d9aa529e409commit-bot@chromium.org} 1627d393b17cf3427bd6f6255f8670067d9aa529e409commit-bot@chromium.org 1628d393b17cf3427bd6f6255f8670067d9aa529e409commit-bot@chromium.orgbool SampleWindow::onQuery(SkEvent* query) { 1629d393b17cf3427bd6f6255f8670067d9aa529e409commit-bot@chromium.org if (query->isType("get-slide-count")) { 1630d393b17cf3427bd6f6255f8670067d9aa529e409commit-bot@chromium.org query->setFast32(fSamples.count()); 1631d393b17cf3427bd6f6255f8670067d9aa529e409commit-bot@chromium.org return true; 1632d393b17cf3427bd6f6255f8670067d9aa529e409commit-bot@chromium.org } 1633d393b17cf3427bd6f6255f8670067d9aa529e409commit-bot@chromium.org if (query->isType("get-slide-title")) { 1634d393b17cf3427bd6f6255f8670067d9aa529e409commit-bot@chromium.org SkView* view = (*fSamples[query->getFast32()])(); 1635d393b17cf3427bd6f6255f8670067d9aa529e409commit-bot@chromium.org SkEvent evt(gTitleEvtName); 1636d393b17cf3427bd6f6255f8670067d9aa529e409commit-bot@chromium.org if (view->doQuery(&evt)) { 1637d393b17cf3427bd6f6255f8670067d9aa529e409commit-bot@chromium.org query->setString("title", evt.findString(gTitleEvtName)); 1638d393b17cf3427bd6f6255f8670067d9aa529e409commit-bot@chromium.org } 1639d393b17cf3427bd6f6255f8670067d9aa529e409commit-bot@chromium.org SkSafeUnref(view); 1640659c8c06cdc6c825004515240f81a8dafb2b4b0fepoger@google.com return true; 1641659c8c06cdc6c825004515240f81a8dafb2b4b0fepoger@google.com } 1642c8263e704135436f71a585801966294d6deadeebepoger@google.com if (query->isType("use-fast-text")) { 1643c8263e704135436f71a585801966294d6deadeebepoger@google.com SkEvent evt(gFastTextEvtName); 1644d393b17cf3427bd6f6255f8670067d9aa529e409commit-bot@chromium.org return curr_view(this)->doQuery(&evt); 164580724dfeb320d1152128cd33636c9024952432d3epoger@google.com } 164680724dfeb320d1152128cd33636c9024952432d3epoger@google.com if (query->isType("ignore-window-bitmap")) { 1647c8263e704135436f71a585801966294d6deadeebepoger@google.com query->setFast32(this->getGrContext() != NULL); 16486f6568b27eae62fea23ab8192c6da02ab892bb5eepoger@google.com return true; 164938aeb0fd7a2bdab5e44531d96045dffe25c8e2b0commit-bot@chromium.org } 1650659c8c06cdc6c825004515240f81a8dafb2b4b0fepoger@google.com return this->INHERITED::onQuery(query); 165180724dfeb320d1152128cd33636c9024952432d3epoger@google.com} 165280724dfeb320d1152128cd33636c9024952432d3epoger@google.com 165380724dfeb320d1152128cd33636c9024952432d3epoger@google.com#if 0 // UNUSED 1654c8263e704135436f71a585801966294d6deadeebepoger@google.comstatic void cleanup_for_filename(SkString* name) { 1655c8263e704135436f71a585801966294d6deadeebepoger@google.com char* str = name->writable_str(); 1656c8263e704135436f71a585801966294d6deadeebepoger@google.com for (size_t i = 0; i < name->size(); i++) { 1657c8263e704135436f71a585801966294d6deadeebepoger@google.com switch (str[i]) { 1658c8263e704135436f71a585801966294d6deadeebepoger@google.com case ':': str[i] = '-'; break; 1659c8263e704135436f71a585801966294d6deadeebepoger@google.com case '/': str[i] = '-'; break; 1660c8263e704135436f71a585801966294d6deadeebepoger@google.com case ' ': str[i] = '_'; break; 1661c8263e704135436f71a585801966294d6deadeebepoger@google.com default: break; 166280724dfeb320d1152128cd33636c9024952432d3epoger@google.com } 1663c8263e704135436f71a585801966294d6deadeebepoger@google.com } 1664d4d44f08d73933dd64fffa75042aa19d45b772casenorblanco@chromium.org} 1665c8263e704135436f71a585801966294d6deadeebepoger@google.com#endif 1666659c8c06cdc6c825004515240f81a8dafb2b4b0fepoger@google.com 1667c8263e704135436f71a585801966294d6deadeebepoger@google.comDECLARE_bool(portableFonts); 1668c8263e704135436f71a585801966294d6deadeebepoger@google.com 1669c8263e704135436f71a585801966294d6deadeebepoger@google.combool SampleWindow::onHandleChar(SkUnichar uni) { 1670c8263e704135436f71a585801966294d6deadeebepoger@google.com { 1671c8263e704135436f71a585801966294d6deadeebepoger@google.com SkView* view = curr_view(this); 1672c8263e704135436f71a585801966294d6deadeebepoger@google.com if (view) { 1673c8263e704135436f71a585801966294d6deadeebepoger@google.com SkEvent evt(gCharEvtName); 1674c8263e704135436f71a585801966294d6deadeebepoger@google.com evt.setFast32(uni); 1675c8263e704135436f71a585801966294d6deadeebepoger@google.com if (view->doQuery(&evt)) { 1676c8263e704135436f71a585801966294d6deadeebepoger@google.com return true; 1677c8263e704135436f71a585801966294d6deadeebepoger@google.com } 1678c8263e704135436f71a585801966294d6deadeebepoger@google.com } 1679c8263e704135436f71a585801966294d6deadeebepoger@google.com } 1680c8263e704135436f71a585801966294d6deadeebepoger@google.com 1681c8263e704135436f71a585801966294d6deadeebepoger@google.com int dx = 0xFF; 1682c8263e704135436f71a585801966294d6deadeebepoger@google.com int dy = 0xFF; 1683c8263e704135436f71a585801966294d6deadeebepoger@google.com 168438aeb0fd7a2bdab5e44531d96045dffe25c8e2b0commit-bot@chromium.org switch (uni) { 1685659c8c06cdc6c825004515240f81a8dafb2b4b0fepoger@google.com case '5': dx = 0; dy = 0; break; 1686c8263e704135436f71a585801966294d6deadeebepoger@google.com case '8': dx = 0; dy = -1; break; 168780724dfeb320d1152128cd33636c9024952432d3epoger@google.com case '6': dx = 1; dy = 0; break; 1688c8263e704135436f71a585801966294d6deadeebepoger@google.com case '2': dx = 0; dy = 1; break; 168980724dfeb320d1152128cd33636c9024952432d3epoger@google.com case '4': dx = -1; dy = 0; break; 1690c8263e704135436f71a585801966294d6deadeebepoger@google.com case '7': dx = -1; dy = -1; break; 1691c8263e704135436f71a585801966294d6deadeebepoger@google.com case '9': dx = 1; dy = -1; break; 1692c8263e704135436f71a585801966294d6deadeebepoger@google.com case '3': dx = 1; dy = 1; break; 1693c8263e704135436f71a585801966294d6deadeebepoger@google.com case '1': dx = -1; dy = 1; break; 1694c8263e704135436f71a585801966294d6deadeebepoger@google.com 1695c8263e704135436f71a585801966294d6deadeebepoger@google.com default: 1696c8263e704135436f71a585801966294d6deadeebepoger@google.com break; 169780724dfeb320d1152128cd33636c9024952432d3epoger@google.com } 169880724dfeb320d1152128cd33636c9024952432d3epoger@google.com 169980724dfeb320d1152128cd33636c9024952432d3epoger@google.com if (0xFF != dx && 0xFF != dy) { 170080724dfeb320d1152128cd33636c9024952432d3epoger@google.com if ((dx | dy) == 0) { 170180724dfeb320d1152128cd33636c9024952432d3epoger@google.com fScrollTestX = fScrollTestY = 0; 170285195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org } else { 170385195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org fScrollTestX += dx; 170485195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org fScrollTestY += dy; 170585195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org } 170685195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org this->inval(NULL); 170785195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org return true; 170885195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org } 170985195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org 171085195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org switch (uni) { 171185195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org case 'B': 171285195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org post_event_to_sink(SkNEW_ARGS(SkEvent, ("PictFileView::toggleBBox")), curr_view(this)); 171385195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org // Cannot call updateTitle() synchronously, because the toggleBBox event is still in 171485195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org // the queue. 171585195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org post_event_to_sink(SkNEW_ARGS(SkEvent, (gUpdateWindowTitleEvtName)), this); 171685195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org this->inval(NULL); 171785195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org break; 171885195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org case 'f': 171985195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org // only 172085195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org toggleFPS(); 172185195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org break; 172285195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org case 'F': 172385195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org FLAGS_portableFonts ^= true; 172485195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org this->inval(NULL); 172585195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org break; 172638aeb0fd7a2bdab5e44531d96045dffe25c8e2b0commit-bot@chromium.org case 'g': 172785195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org fRequestGrabImage = true; 172885195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org this->inval(NULL); 172985195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org break; 173085195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org case 'G': 173185195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org gShowGMBounds = !gShowGMBounds; 173285195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org post_event_to_sink(GMSampleView::NewShowSizeEvt(gShowGMBounds), 173385195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org curr_view(this)); 173485195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org this->inval(NULL); 173585195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org break; 173685195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org case 'i': 173785195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org this->zoomIn(); 173885195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org break; 173985195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org case 'o': 174085195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org this->zoomOut(); 174185195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org break; 174285195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org case 'r': 174385195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org fRotate = !fRotate; 174485195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org fRotateAnimTime = 0; 174585195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org this->inval(NULL); 174685195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org this->updateTitle(); 174785195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org return true; 174885195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org case 'k': 174985195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org fPerspAnim = !fPerspAnim; 175085195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org this->inval(NULL); 175185195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org this->updateTitle(); 175285195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org return true; 175385195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org#if SK_SUPPORT_GPU 175485195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org case '\\': 175585195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org this->setDeviceType(kNullGPU_DeviceType); 175685195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org this->inval(NULL); 175785195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org this->updateTitle(); 175885195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org return true; 175985195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org case 'p': 176085195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org { 176185195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org GrContext* grContext = this->getGrContext(); 176285195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org if (grContext) { 176385195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org size_t cacheBytes; 176485195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org grContext->getResourceCacheUsage(NULL, &cacheBytes); 176585195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org grContext->freeGpuResources(); 176685195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org SkDebugf("Purged %d bytes from the GPU resource cache.\n", cacheBytes); 176785195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org } 176885195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org } 176985195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org return true; 177085195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org#endif 177185195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org default: 177285195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org break; 177385195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org } 177485195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org 177585195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org if (fAppMenu->handleKeyEquivalent(uni)|| fSlideMenu->handleKeyEquivalent(uni)) { 177685195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org this->onUpdateMenu(fAppMenu); 177785195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org this->onUpdateMenu(fSlideMenu); 177885195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org return true; 177985195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org } 178085195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org return this->INHERITED::onHandleChar(uni); 178185195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org} 178285195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org 178385195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.orgvoid SampleWindow::setDeviceType(DeviceType type) { 178485195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org if (type == fDeviceType) 178585195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org return; 178695c2003740c4cd01fd1b02ed93b9de7227b1d0f5commit-bot@chromium.org 178785195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org fDevManager->tearDownBackend(this); 178885195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org 178985195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org fDeviceType = type; 179085195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org 179185195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org fDevManager->setUpBackend(this, fMSAASampleCount); 179285195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org 179395c2003740c4cd01fd1b02ed93b9de7227b1d0f5commit-bot@chromium.org this->updateTitle(); 179485195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org this->inval(NULL); 179585195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org} 179685195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org 179785195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.orgvoid SampleWindow::toggleSlideshow() { 179885195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org fAnimating = !fAnimating; 179985195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org this->postAnimatingEvent(); 180085195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org this->updateTitle(); 180185195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org} 180285195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org 180385195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.orgvoid SampleWindow::toggleRendering() { 180485195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org this->setDeviceType(cycle_devicetype(fDeviceType)); 180585195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org this->updateTitle(); 180685195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org this->inval(NULL); 180785195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org} 180885195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org 180985195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.orgvoid SampleWindow::toggleFPS() { 181085195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org fMeasureFPS = !fMeasureFPS; 181185195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org this->updateTitle(); 181285195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org this->inval(NULL); 181385195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org} 181485195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org 181585195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org#include "SkDumpCanvas.h" 181685195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org 181785195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.orgbool SampleWindow::onHandleKey(SkKey key) { 181885195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org { 181985195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org SkView* view = curr_view(this); 182085195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org if (view) { 182185195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org SkEvent evt(gKeyEvtName); 182285195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org evt.setFast32(key); 182385195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org if (view->doQuery(&evt)) { 182485195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org return true; 182585195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org } 182685195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org } 182785195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org } 182885195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org switch (key) { 182985195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org case kRight_SkKey: 183085195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org if (this->nextSample()) { 183185195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org return true; 183285195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org } 183385195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org break; 183485195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org case kLeft_SkKey: 1835310478e72c63e639373465216271b81f1e4a9136epoger@google.com if (this->previousSample()) { 1836f711f320a34216fc9f64839b90b99a1492c54e09epoger@google.com return true; 1837f711f320a34216fc9f64839b90b99a1492c54e09epoger@google.com } 1838f711f320a34216fc9f64839b90b99a1492c54e09epoger@google.com return true; 1839f711f320a34216fc9f64839b90b99a1492c54e09epoger@google.com case kUp_SkKey: 1840f711f320a34216fc9f64839b90b99a1492c54e09epoger@google.com if (USE_ARROWS_FOR_ZOOM) { 1841f711f320a34216fc9f64839b90b99a1492c54e09epoger@google.com this->changeZoomLevel(1.f / 32.f); 1842f711f320a34216fc9f64839b90b99a1492c54e09epoger@google.com } else { 1843f711f320a34216fc9f64839b90b99a1492c54e09epoger@google.com fNClip = !fNClip; 1844f711f320a34216fc9f64839b90b99a1492c54e09epoger@google.com this->inval(NULL); 1845f711f320a34216fc9f64839b90b99a1492c54e09epoger@google.com this->updateTitle(); 18462b3a204bf68c9e41e62e0f2db5dfe263ea811424commit-bot@chromium.org } 1847f711f320a34216fc9f64839b90b99a1492c54e09epoger@google.com return true; 1848f711f320a34216fc9f64839b90b99a1492c54e09epoger@google.com case kDown_SkKey: 1849f711f320a34216fc9f64839b90b99a1492c54e09epoger@google.com if (USE_ARROWS_FOR_ZOOM) { 1850f711f320a34216fc9f64839b90b99a1492c54e09epoger@google.com this->changeZoomLevel(-1.f / 32.f); 1851f711f320a34216fc9f64839b90b99a1492c54e09epoger@google.com } else { 1852f711f320a34216fc9f64839b90b99a1492c54e09epoger@google.com this->setColorType(cycle_colortypes(this->getBitmap().colorType())); 1853f711f320a34216fc9f64839b90b99a1492c54e09epoger@google.com this->updateTitle(); 1854f711f320a34216fc9f64839b90b99a1492c54e09epoger@google.com } 1855f711f320a34216fc9f64839b90b99a1492c54e09epoger@google.com return true; 1856f711f320a34216fc9f64839b90b99a1492c54e09epoger@google.com case kOK_SkKey: { 1857f711f320a34216fc9f64839b90b99a1492c54e09epoger@google.com SkString title; 1858f711f320a34216fc9f64839b90b99a1492c54e09epoger@google.com if (curr_title(this, &title)) { 1859f711f320a34216fc9f64839b90b99a1492c54e09epoger@google.com writeTitleToPrefs(title.c_str()); 1860f711f320a34216fc9f64839b90b99a1492c54e09epoger@google.com } 1861f711f320a34216fc9f64839b90b99a1492c54e09epoger@google.com return true; 1862f711f320a34216fc9f64839b90b99a1492c54e09epoger@google.com } 1863f711f320a34216fc9f64839b90b99a1492c54e09epoger@google.com case kBack_SkKey: 1864f711f320a34216fc9f64839b90b99a1492c54e09epoger@google.com this->showOverview(); 1865f711f320a34216fc9f64839b90b99a1492c54e09epoger@google.com return true; 1866f711f320a34216fc9f64839b90b99a1492c54e09epoger@google.com default: 1867f711f320a34216fc9f64839b90b99a1492c54e09epoger@google.com break; 1868f711f320a34216fc9f64839b90b99a1492c54e09epoger@google.com } 1869f711f320a34216fc9f64839b90b99a1492c54e09epoger@google.com return this->INHERITED::onHandleKey(key); 1870f711f320a34216fc9f64839b90b99a1492c54e09epoger@google.com} 1871f711f320a34216fc9f64839b90b99a1492c54e09epoger@google.com 1872310478e72c63e639373465216271b81f1e4a9136epoger@google.com/////////////////////////////////////////////////////////////////////////////// 1873310478e72c63e639373465216271b81f1e4a9136epoger@google.com 1874310478e72c63e639373465216271b81f1e4a9136epoger@google.comstatic const char gGestureClickType[] = "GestureClickType"; 1875310478e72c63e639373465216271b81f1e4a9136epoger@google.com 1876310478e72c63e639373465216271b81f1e4a9136epoger@google.combool SampleWindow::onDispatchClick(int x, int y, Click::State state, 1877310478e72c63e639373465216271b81f1e4a9136epoger@google.com void* owner, unsigned modi) { 1878310478e72c63e639373465216271b81f1e4a9136epoger@google.com if (Click::kMoved_State == state) { 1879310478e72c63e639373465216271b81f1e4a9136epoger@google.com updatePointer(x, y); 1880310478e72c63e639373465216271b81f1e4a9136epoger@google.com } 1881310478e72c63e639373465216271b81f1e4a9136epoger@google.com int w = SkScalarRoundToInt(this->width()); 1882310478e72c63e639373465216271b81f1e4a9136epoger@google.com int h = SkScalarRoundToInt(this->height()); 1883310478e72c63e639373465216271b81f1e4a9136epoger@google.com 1884310478e72c63e639373465216271b81f1e4a9136epoger@google.com // check for the resize-box 1885310478e72c63e639373465216271b81f1e4a9136epoger@google.com if (w - x < 16 && h - y < 16) { 1886310478e72c63e639373465216271b81f1e4a9136epoger@google.com return false; // let the OS handle the click 1887310478e72c63e639373465216271b81f1e4a9136epoger@google.com } 1888310478e72c63e639373465216271b81f1e4a9136epoger@google.com else if (fMagnify) { 1889310478e72c63e639373465216271b81f1e4a9136epoger@google.com //it's only necessary to update the drawing if there's a click 1890310478e72c63e639373465216271b81f1e4a9136epoger@google.com this->inval(NULL); 1891310478e72c63e639373465216271b81f1e4a9136epoger@google.com return false; //prevent dragging while magnify is enabled 1892310478e72c63e639373465216271b81f1e4a9136epoger@google.com } else { 1893310478e72c63e639373465216271b81f1e4a9136epoger@google.com // capture control+option, and trigger debugger 1894310478e72c63e639373465216271b81f1e4a9136epoger@google.com if ((modi & kControl_SkModifierKey) && (modi & kOption_SkModifierKey)) { 1895310478e72c63e639373465216271b81f1e4a9136epoger@google.com if (Click::kDown_State == state) { 1896310478e72c63e639373465216271b81f1e4a9136epoger@google.com SkEvent evt("debug-hit-test"); 1897310478e72c63e639373465216271b81f1e4a9136epoger@google.com evt.setS32("debug-hit-test-x", x); 1898310478e72c63e639373465216271b81f1e4a9136epoger@google.com evt.setS32("debug-hit-test-y", y); 1899310478e72c63e639373465216271b81f1e4a9136epoger@google.com curr_view(this)->doEvent(evt); 1900310478e72c63e639373465216271b81f1e4a9136epoger@google.com } 1901310478e72c63e639373465216271b81f1e4a9136epoger@google.com return true; 1902310478e72c63e639373465216271b81f1e4a9136epoger@google.com } else { 1903310478e72c63e639373465216271b81f1e4a9136epoger@google.com return this->INHERITED::onDispatchClick(x, y, state, owner, modi); 1904310478e72c63e639373465216271b81f1e4a9136epoger@google.com } 1905310478e72c63e639373465216271b81f1e4a9136epoger@google.com } 1906310478e72c63e639373465216271b81f1e4a9136epoger@google.com} 1907310478e72c63e639373465216271b81f1e4a9136epoger@google.com 1908310478e72c63e639373465216271b81f1e4a9136epoger@google.comclass GestureClick : public SkView::Click { 1909310478e72c63e639373465216271b81f1e4a9136epoger@google.compublic: 19100dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org GestureClick(SkView* target) : SkView::Click(target) { 19110dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org this->setType(gGestureClickType); 19120dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org } 1913fdea3259d01572fdc09fec5ae84258a6e162da65epoger@google.com 1914fdea3259d01572fdc09fec5ae84258a6e162da65epoger@google.com static bool IsGesture(Click* click) { 1915fdea3259d01572fdc09fec5ae84258a6e162da65epoger@google.com return click->isType(gGestureClickType); 1916fdea3259d01572fdc09fec5ae84258a6e162da65epoger@google.com } 1917fdea3259d01572fdc09fec5ae84258a6e162da65epoger@google.com}; 1918fdea3259d01572fdc09fec5ae84258a6e162da65epoger@google.com 1919fdea3259d01572fdc09fec5ae84258a6e162da65epoger@google.comSkView::Click* SampleWindow::onFindClickHandler(SkScalar x, SkScalar y, 1920fdea3259d01572fdc09fec5ae84258a6e162da65epoger@google.com unsigned modi) { 1921fdea3259d01572fdc09fec5ae84258a6e162da65epoger@google.com return new GestureClick(this); 1922fdea3259d01572fdc09fec5ae84258a6e162da65epoger@google.com} 1923fdea3259d01572fdc09fec5ae84258a6e162da65epoger@google.com 19240dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.orgbool SampleWindow::onClick(Click* click) { 19250dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org if (GestureClick::IsGesture(click)) { 19260dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org float x = static_cast<float>(click->fICurr.fX); 19270dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org float y = static_cast<float>(click->fICurr.fY); 19288fc3766c58ec879389c3c83c96a73e50ff59eb78vandebo@chromium.org 19290dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org switch (click->fState) { 19300dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org case SkView::Click::kDown_State: 19310dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org fGesture.touchBegin(click->fOwner, x, y); 19320dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org break; 19330dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org case SkView::Click::kMoved_State: 1934fdea3259d01572fdc09fec5ae84258a6e162da65epoger@google.com fGesture.touchMoved(click->fOwner, x, y); 1935fdea3259d01572fdc09fec5ae84258a6e162da65epoger@google.com this->updateMatrix(); 1936fdea3259d01572fdc09fec5ae84258a6e162da65epoger@google.com break; 1937fdea3259d01572fdc09fec5ae84258a6e162da65epoger@google.com case SkView::Click::kUp_State: 1938fdea3259d01572fdc09fec5ae84258a6e162da65epoger@google.com fGesture.touchEnd(click->fOwner); 1939ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org this->updateMatrix(); 1940ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org break; 1941fb2cd425c2271c3d42c9667753b33ae71f05ef1breed@google.com } 194209fd4d216963c498c24ba355accce9337a5029a8scroggo@google.com return true; 194309fd4d216963c498c24ba355accce9337a5029a8scroggo@google.com } 1944dd8e353bef35b2656b83499289b409af3b0e3f10bsalomon@google.com return false; 1945dd8e353bef35b2656b83499289b409af3b0e3f10bsalomon@google.com} 1946dd8e353bef35b2656b83499289b409af3b0e3f10bsalomon@google.com 1947dd8e353bef35b2656b83499289b409af3b0e3f10bsalomon@google.com/////////////////////////////////////////////////////////////////////////////// 1948dd8e353bef35b2656b83499289b409af3b0e3f10bsalomon@google.com 1949dd8e353bef35b2656b83499289b409af3b0e3f10bsalomon@google.comvoid SampleWindow::loadView(SkView* view) { 1950dd8e353bef35b2656b83499289b409af3b0e3f10bsalomon@google.com SkView::F2BIter iter(this); 195109fd4d216963c498c24ba355accce9337a5029a8scroggo@google.com SkView* prev = iter.next(); 1952dd8e353bef35b2656b83499289b409af3b0e3f10bsalomon@google.com if (prev) { 1953dd8e353bef35b2656b83499289b409af3b0e3f10bsalomon@google.com prev->detachFromParent(); 1954dd8e353bef35b2656b83499289b409af3b0e3f10bsalomon@google.com } 1955ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org 1956dd8e353bef35b2656b83499289b409af3b0e3f10bsalomon@google.com view->setVisibleP(true); 1957dd8e353bef35b2656b83499289b409af3b0e3f10bsalomon@google.com view->setClipToBounds(false); 1958ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org this->attachChildToFront(view)->unref(); 19592b3a204bf68c9e41e62e0f2db5dfe263ea811424commit-bot@chromium.org view->setSize(this->width(), this->height()); 19602b3a204bf68c9e41e62e0f2db5dfe263ea811424commit-bot@chromium.org 1961ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org //repopulate the slide menu when a view is loaded 1962ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org fSlideMenu->reset(); 1963dd8e353bef35b2656b83499289b409af3b0e3f10bsalomon@google.com 1964dd8e353bef35b2656b83499289b409af3b0e3f10bsalomon@google.com (void)SampleView::SetUsePipe(view, fPipeState); 1965ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org if (SampleView::IsSampleView(view)) { 1966dd8e353bef35b2656b83499289b409af3b0e3f10bsalomon@google.com SampleView* sampleView = (SampleView*)view; 1967dd8e353bef35b2656b83499289b409af3b0e3f10bsalomon@google.com sampleView->requestMenu(fSlideMenu); 196809fd4d216963c498c24ba355accce9337a5029a8scroggo@google.com sampleView->onTileSizeChanged(this->tileSize()); 19692b3a204bf68c9e41e62e0f2db5dfe263ea811424commit-bot@chromium.org } 1970ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org this->onUpdateMenu(fSlideMenu); 197109fd4d216963c498c24ba355accce9337a5029a8scroggo@google.com this->updateTitle(); 197209fd4d216963c498c24ba355accce9337a5029a8scroggo@google.com} 19737d519305bb52eadf6b8265c6720642193791a364scroggo@google.com 197409fd4d216963c498c24ba355accce9337a5029a8scroggo@google.comstatic const char* gDeviceTypePrefix[] = { 197509fd4d216963c498c24ba355accce9337a5029a8scroggo@google.com "raster: ", 197609fd4d216963c498c24ba355accce9337a5029a8scroggo@google.com "picture: ", 197709fd4d216963c498c24ba355accce9337a5029a8scroggo@google.com#if SK_SUPPORT_GPU 19780b735631b7d22316693629a4110c7e95b2a7633escroggo@google.com "opengl: ", 19792b3a204bf68c9e41e62e0f2db5dfe263ea811424commit-bot@chromium.org#if SK_ANGLE 1980ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org "angle: ", 198109fd4d216963c498c24ba355accce9337a5029a8scroggo@google.com#endif // SK_ANGLE 198209fd4d216963c498c24ba355accce9337a5029a8scroggo@google.com "null-gl: " 198309fd4d216963c498c24ba355accce9337a5029a8scroggo@google.com#endif // SK_SUPPORT_GPU 1984ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org}; 1985ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.orgSK_COMPILE_ASSERT(SK_ARRAY_COUNT(gDeviceTypePrefix) == SampleWindow::kDeviceTypeCnt, 1986ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org array_size_mismatch); 1987ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org 1988ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.orgstatic const char* trystate_str(SkOSMenu::TriState state, 1989ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org const char trueStr[], const char falseStr[]) { 1990ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org if (SkOSMenu::kOnState == state) { 1991ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org return trueStr; 1992ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org } else if (SkOSMenu::kOffState == state) { 1993ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org return falseStr; 1994ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org } 1995ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org return NULL; 1996ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org} 1997ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org 1998ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.orgvoid SampleWindow::updateTitle() { 1999ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org SkView* view = curr_view(this); 2000ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org 2001fb2cd425c2271c3d42c9667753b33ae71f05ef1breed@google.com SkString title; 2002ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org if (!curr_title(this, &title)) { 2003ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org title.set("<unknown>"); 2004ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org } 2005ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org 2006ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org title.prepend(gDeviceTypePrefix[fDeviceType]); 2007ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org 2008ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org title.prepend(" "); 20092b3a204bf68c9e41e62e0f2db5dfe263ea811424commit-bot@chromium.org title.prepend(sk_tool_utils::colortype_name(this->getBitmap().colorType())); 20102b3a204bf68c9e41e62e0f2db5dfe263ea811424commit-bot@chromium.org 2011ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org if (fTilingMode != kNo_Tiling) { 2012ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org title.prependf("<T: %s> ", gTilingInfo[fTilingMode].label); 2013ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org } 2014ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org if (fAnimating) { 2015ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org title.prepend("<A> "); 20162b3a204bf68c9e41e62e0f2db5dfe263ea811424commit-bot@chromium.org } 20172b3a204bf68c9e41e62e0f2db5dfe263ea811424commit-bot@chromium.org if (fRotate) { 20182b3a204bf68c9e41e62e0f2db5dfe263ea811424commit-bot@chromium.org title.prepend("<R> "); 2019ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org } 2020ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org if (fNClip) { 2021ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org title.prepend("<C> "); 20224c75f241cb75f202cfa51569ba8dc4749a28a9f7bsalomon@google.com } 20234c75f241cb75f202cfa51569ba8dc4749a28a9f7bsalomon@google.com if (fPerspAnim) { 2024ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org title.prepend("<K> "); 20254c75f241cb75f202cfa51569ba8dc4749a28a9f7bsalomon@google.com } 2026ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org 20272b3a204bf68c9e41e62e0f2db5dfe263ea811424commit-bot@chromium.org title.prepend(trystate_str(fLCDState, "LCD ", "lcd ")); 2028ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org title.prepend(trystate_str(fAAState, "AA ", "aa ")); 2029ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org title.prepend(gFilterLevelStates[fFilterLevelIndex].fLabel); 2030ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org title.prepend(trystate_str(fSubpixelState, "S ", "s ")); 2031ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org title.prepend(fFlipAxis & kFlipAxis_X ? "X " : NULL); 2032ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org title.prepend(fFlipAxis & kFlipAxis_Y ? "Y " : NULL); 2033ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org title.prepend(gHintingStates[fHintingState].label); 2034ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org 2035ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org if (fZoomLevel) { 2036ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org title.prependf("{%.2f} ", SkScalarToFloat(fZoomLevel)); 20372b3a204bf68c9e41e62e0f2db5dfe263ea811424commit-bot@chromium.org } 2038ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org 2039ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org if (fMeasureFPS) { 2040ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org title.appendf(" %8.3f ms", fMeasureFPS_Time / (float)FPS_REPEAT_COUNT); 2041ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org } 20420dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org if (SampleView::IsSampleView(view)) { 20430dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org switch (fPipeState) { 20440dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org case SkOSMenu::kOnState: 20450dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org title.prepend("<Pipe> "); 20460dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org break; 20470dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org case SkOSMenu::kMixedState: 20480dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org title.prepend("<Tiled Pipe> "); 20490dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org break; 20500dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org 20510dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org default: 20520dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org break; 20530dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org } 20540dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org title.prepend("! "); 20550dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org } 20560dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org 2057f8afb2bd5853f9d66448ba1f23251f8c93340bf6vandebo@chromium.org#if SK_SUPPORT_GPU 2058f8afb2bd5853f9d66448ba1f23251f8c93340bf6vandebo@chromium.org if (IsGpuDeviceType(fDeviceType) && 20590dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org fDevManager && 20600dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org fDevManager->getGrRenderTarget() && 20610dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org fDevManager->getGrRenderTarget()->numSamples() > 0) { 20620dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org title.appendf(" [MSAA: %d]", 20630dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org fDevManager->getGrRenderTarget()->numSamples()); 2064f8afb2bd5853f9d66448ba1f23251f8c93340bf6vandebo@chromium.org } 2065f8afb2bd5853f9d66448ba1f23251f8c93340bf6vandebo@chromium.org#endif 2066f8afb2bd5853f9d66448ba1f23251f8c93340bf6vandebo@chromium.org 2067f8afb2bd5853f9d66448ba1f23251f8c93340bf6vandebo@chromium.org this->setTitle(title.c_str()); 2068f8afb2bd5853f9d66448ba1f23251f8c93340bf6vandebo@chromium.org} 2069f8afb2bd5853f9d66448ba1f23251f8c93340bf6vandebo@chromium.org 20702b3a204bf68c9e41e62e0f2db5dfe263ea811424commit-bot@chromium.orgvoid SampleWindow::onSizeChange() { 2071f8afb2bd5853f9d66448ba1f23251f8c93340bf6vandebo@chromium.org this->INHERITED::onSizeChange(); 2072f8afb2bd5853f9d66448ba1f23251f8c93340bf6vandebo@chromium.org 2073f8afb2bd5853f9d66448ba1f23251f8c93340bf6vandebo@chromium.org SkView::F2BIter iter(this); 2074f8afb2bd5853f9d66448ba1f23251f8c93340bf6vandebo@chromium.org SkView* view = iter.next(); 2075f8afb2bd5853f9d66448ba1f23251f8c93340bf6vandebo@chromium.org view->setSize(this->width(), this->height()); 20760dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org 20770dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org // rebuild our clippath 20780dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org { 20790dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org const SkScalar W = this->width(); 20800dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org const SkScalar H = this->height(); 20810dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org 20820dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org fClipPath.reset(); 20830dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org#if 0 20842b3a204bf68c9e41e62e0f2db5dfe263ea811424commit-bot@chromium.org for (SkScalar y = SK_Scalar1; y < H; y += SkIntToScalar(32)) { 20850dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org SkRect r; 20860dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org r.set(SK_Scalar1, y, SkIntToScalar(30), y + SkIntToScalar(30)); 20870dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org for (; r.fLeft < W; r.offset(SkIntToScalar(32), 0)) 20880dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org fClipPath.addRect(r); 2089ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org } 20909677a84b4055ab084b2aae6adeab31ab1c7a95b7commit-bot@chromium.org#else 2091ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org SkRect r; 20929677a84b4055ab084b2aae6adeab31ab1c7a95b7commit-bot@chromium.org r.set(0, 0, W, H); 20939677a84b4055ab084b2aae6adeab31ab1c7a95b7commit-bot@chromium.org fClipPath.addRect(r, SkPath::kCCW_Direction); 20949677a84b4055ab084b2aae6adeab31ab1c7a95b7commit-bot@chromium.org r.set(W/4, H/4, W*3/4, H*3/4); 20959677a84b4055ab084b2aae6adeab31ab1c7a95b7commit-bot@chromium.org fClipPath.addRect(r, SkPath::kCW_Direction); 20962b3a204bf68c9e41e62e0f2db5dfe263ea811424commit-bot@chromium.org#endif 2097ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org } 20989677a84b4055ab084b2aae6adeab31ab1c7a95b7commit-bot@chromium.org 2099ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org fZoomCenterX = SkScalarHalf(this->width()); 21009677a84b4055ab084b2aae6adeab31ab1c7a95b7commit-bot@chromium.org fZoomCenterY = SkScalarHalf(this->height()); 21019677a84b4055ab084b2aae6adeab31ab1c7a95b7commit-bot@chromium.org 21029677a84b4055ab084b2aae6adeab31ab1c7a95b7commit-bot@chromium.org#ifdef SK_BUILD_FOR_ANDROID 2103ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org // FIXME: The first draw after a size change does not work on Android, so 2104ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org // we post an invalidate. 2105ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org this->postInvalDelay(); 21063a882dda0787e6957cfb37f6b5a68bcd31ce5cf7epoger@google.com#endif 21073e62ebf93b43139202ce803245411467c7ed13ffcommit-bot@chromium.org this->updateTitle(); // to refresh our config 21083a882dda0787e6957cfb37f6b5a68bcd31ce5cf7epoger@google.com fDevManager->windowSizeChanged(this); 21093a882dda0787e6957cfb37f6b5a68bcd31ce5cf7epoger@google.com 21103e62ebf93b43139202ce803245411467c7ed13ffcommit-bot@chromium.org if (fTilingMode != kNo_Tiling && SampleView::IsSampleView(view)) { 21113e62ebf93b43139202ce803245411467c7ed13ffcommit-bot@chromium.org ((SampleView*)view)->onTileSizeChanged(this->tileSize()); 2112f711f320a34216fc9f64839b90b99a1492c54e09epoger@google.com } 2113f711f320a34216fc9f64839b90b99a1492c54e09epoger@google.com} 2114f711f320a34216fc9f64839b90b99a1492c54e09epoger@google.com 2115f711f320a34216fc9f64839b90b99a1492c54e09epoger@google.com/////////////////////////////////////////////////////////////////////////////// 2116f711f320a34216fc9f64839b90b99a1492c54e09epoger@google.com 2117f711f320a34216fc9f64839b90b99a1492c54e09epoger@google.comstatic const char is_sample_view_tag[] = "sample-is-sample-view"; 2118f711f320a34216fc9f64839b90b99a1492c54e09epoger@google.comstatic const char repeat_count_tag[] = "sample-set-repeat-count"; 2119f711f320a34216fc9f64839b90b99a1492c54e09epoger@google.comstatic const char set_use_pipe_tag[] = "sample-set-use-pipe"; 2120f711f320a34216fc9f64839b90b99a1492c54e09epoger@google.com 2121f711f320a34216fc9f64839b90b99a1492c54e09epoger@google.combool SampleView::IsSampleView(SkView* view) { 2122f711f320a34216fc9f64839b90b99a1492c54e09epoger@google.com SkEvent evt(is_sample_view_tag); 2123f711f320a34216fc9f64839b90b99a1492c54e09epoger@google.com return view->doQuery(&evt); 21243e62ebf93b43139202ce803245411467c7ed13ffcommit-bot@chromium.org} 2125f711f320a34216fc9f64839b90b99a1492c54e09epoger@google.com 2126f711f320a34216fc9f64839b90b99a1492c54e09epoger@google.combool SampleView::SetRepeatDraw(SkView* view, int count) { 2127f711f320a34216fc9f64839b90b99a1492c54e09epoger@google.com SkEvent evt(repeat_count_tag); 2128f711f320a34216fc9f64839b90b99a1492c54e09epoger@google.com evt.setFast32(count); 2129f711f320a34216fc9f64839b90b99a1492c54e09epoger@google.com return view->doEvent(evt); 21303a882dda0787e6957cfb37f6b5a68bcd31ce5cf7epoger@google.com} 21313a882dda0787e6957cfb37f6b5a68bcd31ce5cf7epoger@google.com 21323a882dda0787e6957cfb37f6b5a68bcd31ce5cf7epoger@google.combool SampleView::SetUsePipe(SkView* view, SkOSMenu::TriState state) { 2133ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org SkEvent evt; 2134ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org evt.setS32(set_use_pipe_tag, state); 2135ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org return view->doEvent(evt); 2136ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org} 2137ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org 2138ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.orgbool SampleView::onEvent(const SkEvent& evt) { 21392b3a204bf68c9e41e62e0f2db5dfe263ea811424commit-bot@chromium.org if (evt.isType(repeat_count_tag)) { 2140ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org fRepeatCount = evt.getFast32(); 2141ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org return true; 2142ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org } 2143ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org 2144ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org int32_t pipeHolder; 21459677a84b4055ab084b2aae6adeab31ab1c7a95b7commit-bot@chromium.org if (evt.findS32(set_use_pipe_tag, &pipeHolder)) { 21469677a84b4055ab084b2aae6adeab31ab1c7a95b7commit-bot@chromium.org fPipeState = static_cast<SkOSMenu::TriState>(pipeHolder); 2147ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org return true; 21489677a84b4055ab084b2aae6adeab31ab1c7a95b7commit-bot@chromium.org } 21499677a84b4055ab084b2aae6adeab31ab1c7a95b7commit-bot@chromium.org 21502b3a204bf68c9e41e62e0f2db5dfe263ea811424commit-bot@chromium.org return this->INHERITED::onEvent(evt); 2151ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org} 21529677a84b4055ab084b2aae6adeab31ab1c7a95b7commit-bot@chromium.org 2153ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.orgbool SampleView::onQuery(SkEvent* evt) { 2154ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org if (evt->isType(is_sample_view_tag)) { 21559677a84b4055ab084b2aae6adeab31ab1c7a95b7commit-bot@chromium.org return true; 2156ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org } 2157ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org return this->INHERITED::onQuery(evt); 21589677a84b4055ab084b2aae6adeab31ab1c7a95b7commit-bot@chromium.org} 2159ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org 2160ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org 21619677a84b4055ab084b2aae6adeab31ab1c7a95b7commit-bot@chromium.orgclass SimplePC : public SkGPipeController { 21629677a84b4055ab084b2aae6adeab31ab1c7a95b7commit-bot@chromium.orgpublic: 2163ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org SimplePC(SkCanvas* target); 2164ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org ~SimplePC(); 21659677a84b4055ab084b2aae6adeab31ab1c7a95b7commit-bot@chromium.org 2166ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org virtual void* requestBlock(size_t minRequest, size_t* actual); 21679677a84b4055ab084b2aae6adeab31ab1c7a95b7commit-bot@chromium.org virtual void notifyWritten(size_t bytes); 21689677a84b4055ab084b2aae6adeab31ab1c7a95b7commit-bot@chromium.org 21699677a84b4055ab084b2aae6adeab31ab1c7a95b7commit-bot@chromium.orgprivate: 2170ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org SkGPipeReader fReader; 21719677a84b4055ab084b2aae6adeab31ab1c7a95b7commit-bot@chromium.org void* fBlock; 21729677a84b4055ab084b2aae6adeab31ab1c7a95b7commit-bot@chromium.org size_t fBlockSize; 2173ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org size_t fBytesWritten; 21749677a84b4055ab084b2aae6adeab31ab1c7a95b7commit-bot@chromium.org int fAtomsWritten; 21752b3a204bf68c9e41e62e0f2db5dfe263ea811424commit-bot@chromium.org SkGPipeReader::Status fStatus; 2176ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org 2177c5205629da1e6e4aca83a2a1b3ce08f4bee360fdscroggo@google.com size_t fTotalWritten; 2178c5205629da1e6e4aca83a2a1b3ce08f4bee360fdscroggo@google.com}; 2179ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org 2180ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.orgSimplePC::SimplePC(SkCanvas* target) : fReader(target) { 21819677a84b4055ab084b2aae6adeab31ab1c7a95b7commit-bot@chromium.org fBlock = NULL; 2182ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org fBlockSize = fBytesWritten = 0; 2183ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org fStatus = SkGPipeReader::kDone_Status; 2184ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org fTotalWritten = 0; 21859677a84b4055ab084b2aae6adeab31ab1c7a95b7commit-bot@chromium.org fAtomsWritten = 0; 2186ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org fReader.setBitmapDecoder(&SkImageDecoder::DecodeMemory); 2187ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org} 2188c5205629da1e6e4aca83a2a1b3ce08f4bee360fdscroggo@google.com 2189c5205629da1e6e4aca83a2a1b3ce08f4bee360fdscroggo@google.comSimplePC::~SimplePC() { 2190ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org// SkASSERT(SkGPipeReader::kDone_Status == fStatus); 2191ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org if (fTotalWritten) { 219209fd4d216963c498c24ba355accce9337a5029a8scroggo@google.com SkDebugf("--- %d bytes %d atoms, status %d\n", fTotalWritten, 21938570b5c8695052378491b0c61e745d736fe85c8drobertphillips@google.com fAtomsWritten, fStatus); 219409fd4d216963c498c24ba355accce9337a5029a8scroggo@google.com#ifdef PIPE_FILE 219509fd4d216963c498c24ba355accce9337a5029a8scroggo@google.com //File is open in append mode 219637269607334b99bf814c7dc6b426745d9b7c7e3fepoger@google.com FILE* f = fopen(FILE_PATH, "ab"); 21972b3a204bf68c9e41e62e0f2db5dfe263ea811424commit-bot@chromium.org SkASSERT(f != NULL); 2198ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org fwrite((const char*)fBlock + fBytesWritten, 1, bytes, f); 219937269607334b99bf814c7dc6b426745d9b7c7e3fepoger@google.com fclose(f); 220037269607334b99bf814c7dc6b426745d9b7c7e3fepoger@google.com#endif 2201b0f8b430de74a51f35dbfbff5284a04f8d70ec48epoger@google.com#ifdef PIPE_NET 22022b3a204bf68c9e41e62e0f2db5dfe263ea811424commit-bot@chromium.org if (fAtomsWritten > 1 && fTotalWritten > 4) { //ignore done 2203b0f8b430de74a51f35dbfbff5284a04f8d70ec48epoger@google.com gServer.acceptConnections(); 2204ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org gServer.writePacket(fBlock, fTotalWritten); 2205b0f8b430de74a51f35dbfbff5284a04f8d70ec48epoger@google.com } 220637269607334b99bf814c7dc6b426745d9b7c7e3fepoger@google.com#endif 220725c1066e4d23cf7cb1795c78987f4fde08282b46commit-bot@chromium.org } 2208b0f8b430de74a51f35dbfbff5284a04f8d70ec48epoger@google.com sk_free(fBlock); 22092b3a204bf68c9e41e62e0f2db5dfe263ea811424commit-bot@chromium.org} 2210b0f8b430de74a51f35dbfbff5284a04f8d70ec48epoger@google.com 2211ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.orgvoid* SimplePC::requestBlock(size_t minRequest, size_t* actual) { 221225c1066e4d23cf7cb1795c78987f4fde08282b46commit-bot@chromium.org sk_free(fBlock); 221337269607334b99bf814c7dc6b426745d9b7c7e3fepoger@google.com 2214f32f6e8323d201ede639ba66e1614783428a166dchudy@google.com fBlockSize = minRequest * 4; 2215ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org fBlock = sk_malloc_throw(fBlockSize); 2216ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org fBytesWritten = 0; 2217ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org *actual = fBlockSize; 2218ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org return fBlock; 2219ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org} 2220ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org 2221ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.orgvoid SimplePC::notifyWritten(size_t bytes) { 2222ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org SkASSERT(fBytesWritten + bytes <= fBlockSize); 2223ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org fStatus = fReader.playback((const char*)fBlock + fBytesWritten, bytes); 2224ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org SkASSERT(SkGPipeReader::kError_Status != fStatus); 2225ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org fBytesWritten += bytes; 2226ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org fTotalWritten += bytes; 22272b3a204bf68c9e41e62e0f2db5dfe263ea811424commit-bot@chromium.org 2228ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org fAtomsWritten += 1; 2229ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org} 2230ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org 2231ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.orgvoid SampleView::draw(SkCanvas* canvas) { 2232ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org if (SkOSMenu::kOffState == fPipeState) { 2233ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org this->INHERITED::draw(canvas); 2234ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org } else { 2235ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org SkGPipeWriter writer; 22366dda827913a3dbdb84934f4f1d79c0b702169e5ccommit-bot@chromium.org SimplePC controller(canvas); 22376dda827913a3dbdb84934f4f1d79c0b702169e5ccommit-bot@chromium.org SkBitmap bitmap = capture_bitmap(canvas); 22386dda827913a3dbdb84934f4f1d79c0b702169e5ccommit-bot@chromium.org TiledPipeController tc(bitmap, &SkImageDecoder::DecodeMemory, &canvas->getTotalMatrix()); 22396dda827913a3dbdb84934f4f1d79c0b702169e5ccommit-bot@chromium.org SkGPipeController* pc; 22406dda827913a3dbdb84934f4f1d79c0b702169e5ccommit-bot@chromium.org if (SkOSMenu::kMixedState == fPipeState) { 2241ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org pc = &tc; 22426dda827913a3dbdb84934f4f1d79c0b702169e5ccommit-bot@chromium.org } else { 22436dda827913a3dbdb84934f4f1d79c0b702169e5ccommit-bot@chromium.org pc = &controller; 22446dda827913a3dbdb84934f4f1d79c0b702169e5ccommit-bot@chromium.org } 2245ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org uint32_t flags = SkGPipeWriter::kCrossProcess_Flag; 2246ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org 2247ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org canvas = writer.startRecording(pc, flags); 2248ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org //Must draw before controller goes out of scope and sends data 2249ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org this->INHERITED::draw(canvas); 2250ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org //explicitly end recording to ensure writer is flushed before the memory 2251ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org //is freed in the deconstructor of the controller 2252ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org writer.endRecording(); 22530dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org } 2254ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org} 2255ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org 22560dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.orgvoid SampleView::onDraw(SkCanvas* canvas) { 2257ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org this->onDrawBackground(canvas); 2258ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org 2259ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org for (int i = 0; i < fRepeatCount; i++) { 2260ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org SkAutoCanvasRestore acr(canvas, true); 2261ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org this->onDrawContent(canvas); 2262ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org } 2263ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org} 2264b17ccc992da94e55cef07cedf5491911d78dfa3fcommit-bot@chromium.org 2265b17ccc992da94e55cef07cedf5491911d78dfa3fcommit-bot@chromium.orgvoid SampleView::onDrawBackground(SkCanvas* canvas) { 2266b17ccc992da94e55cef07cedf5491911d78dfa3fcommit-bot@chromium.org canvas->drawColor(fBGColor); 2267b17ccc992da94e55cef07cedf5491911d78dfa3fcommit-bot@chromium.org} 2268ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org 2269ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org/////////////////////////////////////////////////////////////////////////////// 22703e62ebf93b43139202ce803245411467c7ed13ffcommit-bot@chromium.org 2271ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.orgtemplate <typename T> void SkTBSort(T array[], int count) { 2272ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org for (int i = 1; i < count - 1; i++) { 2273ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org bool didSwap = false; 2274ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org for (int j = count - 1; j > i; --j) { 2275ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org if (array[j] < array[j-1]) { 2276ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org T tmp(array[j-1]); 2277ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org array[j-1] = array[j]; 22780dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org array[j] = tmp; 2279ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org didSwap = true; 2280ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org } 2281ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org } 2282ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org if (!didSwap) { 2283b0f8b430de74a51f35dbfbff5284a04f8d70ec48epoger@google.com break; 2284b0f8b430de74a51f35dbfbff5284a04f8d70ec48epoger@google.com } 22852b3a204bf68c9e41e62e0f2db5dfe263ea811424commit-bot@chromium.org } 2286b0f8b430de74a51f35dbfbff5284a04f8d70ec48epoger@google.com 2287fdea3259d01572fdc09fec5ae84258a6e162da65epoger@google.com for (int k = 0; k < count - 1; k++) { 22882b3a204bf68c9e41e62e0f2db5dfe263ea811424commit-bot@chromium.org SkASSERT(!(array[k+1] < array[k])); 2289fdea3259d01572fdc09fec5ae84258a6e162da65epoger@google.com } 22905f99545de67ee729b4b17f1aae56f8c9dcf460f9epoger@google.com} 22912b3a204bf68c9e41e62e0f2db5dfe263ea811424commit-bot@chromium.org 22922b3a204bf68c9e41e62e0f2db5dfe263ea811424commit-bot@chromium.org#include "SkRandom.h" 22935f99545de67ee729b4b17f1aae56f8c9dcf460f9epoger@google.com 2294b0f8b430de74a51f35dbfbff5284a04f8d70ec48epoger@google.comstatic void rand_rect(SkIRect* rect, SkRandom& rand) { 22952b3a204bf68c9e41e62e0f2db5dfe263ea811424commit-bot@chromium.org int bits = 8; 2296b0f8b430de74a51f35dbfbff5284a04f8d70ec48epoger@google.com int shift = 32 - bits; 2297b0f8b430de74a51f35dbfbff5284a04f8d70ec48epoger@google.com rect->set(rand.nextU() >> shift, rand.nextU() >> shift, 22982b3a204bf68c9e41e62e0f2db5dfe263ea811424commit-bot@chromium.org rand.nextU() >> shift, rand.nextU() >> shift); 2299b0f8b430de74a51f35dbfbff5284a04f8d70ec48epoger@google.com rect->sort(); 23008570b5c8695052378491b0c61e745d736fe85c8drobertphillips@google.com} 23018570b5c8695052378491b0c61e745d736fe85c8drobertphillips@google.com 2302310478e72c63e639373465216271b81f1e4a9136epoger@google.comstatic void dumpRect(const SkIRect& r) { 2303ae7b8f3e7ba88baf5f64fdd2f6a70a55367a7ee1reed@google.com SkDebugf(" { %d, %d, %d, %d },\n", 2304ae7b8f3e7ba88baf5f64fdd2f6a70a55367a7ee1reed@google.com r.fLeft, r.fTop, 2305ae7b8f3e7ba88baf5f64fdd2f6a70a55367a7ee1reed@google.com r.fRight, r.fBottom); 2306b17ccc992da94e55cef07cedf5491911d78dfa3fcommit-bot@chromium.org} 2307b17ccc992da94e55cef07cedf5491911d78dfa3fcommit-bot@chromium.org 2308b17ccc992da94e55cef07cedf5491911d78dfa3fcommit-bot@chromium.orgstatic void test_rects(const SkIRect rect[], int count) { 2309b17ccc992da94e55cef07cedf5491911d78dfa3fcommit-bot@chromium.org SkRegion rgn0, rgn1; 2310b17ccc992da94e55cef07cedf5491911d78dfa3fcommit-bot@chromium.org 2311b17ccc992da94e55cef07cedf5491911d78dfa3fcommit-bot@chromium.org for (int i = 0; i < count; i++) { 2312b17ccc992da94e55cef07cedf5491911d78dfa3fcommit-bot@chromium.org rgn0.op(rect[i], SkRegion::kUnion_Op); 2313e8ebeb1f8fde6525bbab988c6090a5d3ab19855bepoger@google.com // dumpRect(rect[i]); 2314b17ccc992da94e55cef07cedf5491911d78dfa3fcommit-bot@chromium.org } 2315b17ccc992da94e55cef07cedf5491911d78dfa3fcommit-bot@chromium.org rgn1.setRects(rect, count); 2316b17ccc992da94e55cef07cedf5491911d78dfa3fcommit-bot@chromium.org 2317b17ccc992da94e55cef07cedf5491911d78dfa3fcommit-bot@chromium.org if (rgn0 != rgn1) { 2318b17ccc992da94e55cef07cedf5491911d78dfa3fcommit-bot@chromium.org SkDebugf("\n"); 2319e8ebeb1f8fde6525bbab988c6090a5d3ab19855bepoger@google.com for (int i = 0; i < count; i++) { 2320b17ccc992da94e55cef07cedf5491911d78dfa3fcommit-bot@chromium.org dumpRect(rect[i]); 2321b17ccc992da94e55cef07cedf5491911d78dfa3fcommit-bot@chromium.org } 2322b17ccc992da94e55cef07cedf5491911d78dfa3fcommit-bot@chromium.org SkDebugf("\n"); 2323b17ccc992da94e55cef07cedf5491911d78dfa3fcommit-bot@chromium.org } 2324b17ccc992da94e55cef07cedf5491911d78dfa3fcommit-bot@chromium.org} 23255f99545de67ee729b4b17f1aae56f8c9dcf460f9epoger@google.com 23265f99545de67ee729b4b17f1aae56f8c9dcf460f9epoger@google.comstatic void test() { 23277361f54294d65a5c42ce5cf1cd56d0fd7122e268bsalomon@google.com size_t i; 23287361f54294d65a5c42ce5cf1cd56d0fd7122e268bsalomon@google.com 232900dae86f5872b60927b28a32b375bc01cd7c61c9reed@android.com const SkIRect r0[] = { 2330f4f9df4c193620167dc6f202f1b72245f4a260cdcommit-bot@chromium.org { 0, 0, 1, 1 }, 2331f4f9df4c193620167dc6f202f1b72245f4a260cdcommit-bot@chromium.org { 2, 2, 3, 3 }, 2332f4f9df4c193620167dc6f202f1b72245f4a260cdcommit-bot@chromium.org }; 2333f4f9df4c193620167dc6f202f1b72245f4a260cdcommit-bot@chromium.org const SkIRect r1[] = { 2334f4f9df4c193620167dc6f202f1b72245f4a260cdcommit-bot@chromium.org { 0, 0, 1, 3 }, 2335f4f9df4c193620167dc6f202f1b72245f4a260cdcommit-bot@chromium.org { 1, 1, 2, 2 }, 2336f4f9df4c193620167dc6f202f1b72245f4a260cdcommit-bot@chromium.org { 2, 0, 3, 3 }, 2337f4f9df4c193620167dc6f202f1b72245f4a260cdcommit-bot@chromium.org }; 233865caeaf32d09f5886f3c740cfef2f1c26ef9cb50skia.committer@gmail.com const SkIRect r2[] = { 23397fd2d70ad39661588de5910abe1006e073419f20scroggo@google.com { 0, 0, 1, 2 }, 2340ae7b8f3e7ba88baf5f64fdd2f6a70a55367a7ee1reed@google.com { 2, 1, 3, 3 }, 234182cb65ba18150e1ff5b6a0e78a8630d59d4d4af9epoger@google.com { 4, 0, 5, 1 }, 234282cb65ba18150e1ff5b6a0e78a8630d59d4d4af9epoger@google.com { 6, 0, 7, 4 }, 2343ae7b8f3e7ba88baf5f64fdd2f6a70a55367a7ee1reed@google.com }; 2344ae7b8f3e7ba88baf5f64fdd2f6a70a55367a7ee1reed@google.com 234582cb65ba18150e1ff5b6a0e78a8630d59d4d4af9epoger@google.com static const struct { 2346ae7b8f3e7ba88baf5f64fdd2f6a70a55367a7ee1reed@google.com const SkIRect* fRects; 2347ae7b8f3e7ba88baf5f64fdd2f6a70a55367a7ee1reed@google.com int fCount; 234838aeb0fd7a2bdab5e44531d96045dffe25c8e2b0commit-bot@chromium.org } gRecs[] = { 2349586db93c447b753364d50fadc5426de4fef9a759sglez@google.com { r0, SK_ARRAY_COUNT(r0) }, 2350a6f37e77c1c95f0a06ac55ff659cb7b8dfabefcfcommit-bot@chromium.org { r1, SK_ARRAY_COUNT(r1) }, 2351ece2b0297c1d55c46b4c63ba7a54f518a490a502reed@google.com { r2, SK_ARRAY_COUNT(r2) }, 2352ece2b0297c1d55c46b4c63ba7a54f518a490a502reed@google.com }; 2353ece2b0297c1d55c46b4c63ba7a54f518a490a502reed@google.com 2354310478e72c63e639373465216271b81f1e4a9136epoger@google.com for (i = 0; i < SK_ARRAY_COUNT(gRecs); i++) { 23559875dd14af6d768da8d1a4be58b98fc91ceca0ddtomhudson@google.com test_rects(gRecs[i].fRects, gRecs[i].fCount); 23562b3a204bf68c9e41e62e0f2db5dfe263ea811424commit-bot@chromium.org } 23572b3a204bf68c9e41e62e0f2db5dfe263ea811424commit-bot@chromium.org 2358b17ccc992da94e55cef07cedf5491911d78dfa3fcommit-bot@chromium.org SkRandom rand; 2359b17ccc992da94e55cef07cedf5491911d78dfa3fcommit-bot@chromium.org for (i = 0; i < 10000; i++) { 236000dae86f5872b60927b28a32b375bc01cd7c61c9reed@android.com SkRegion rgn0, rgn1; 2361310478e72c63e639373465216271b81f1e4a9136epoger@google.com 2362b17ccc992da94e55cef07cedf5491911d78dfa3fcommit-bot@chromium.org const int N = 8; 2363b17ccc992da94e55cef07cedf5491911d78dfa3fcommit-bot@chromium.org SkIRect rect[N]; 2364b17ccc992da94e55cef07cedf5491911d78dfa3fcommit-bot@chromium.org for (int j = 0; j < N; j++) { 2365310478e72c63e639373465216271b81f1e4a9136epoger@google.com rand_rect(&rect[j], rand); 2366310478e72c63e639373465216271b81f1e4a9136epoger@google.com } 236785195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org test_rects(rect, N); 236885195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org } 236985195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org} 237085195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org 237185195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org// FIXME: this should be in a header 237285195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.orgSkOSWindow* create_sk_window(void* hwnd, int argc, char** argv); 237385195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.orgSkOSWindow* create_sk_window(void* hwnd, int argc, char** argv) { 237485195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org if (false) { // avoid bit rot, suppress warning 237585195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org test(); 237685195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org } 237785195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org return new SampleWindow(hwnd, argc, argv, NULL); 237885195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org} 237985195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org 238085195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org// FIXME: this should be in a header 238185195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.orgvoid get_preferred_size(int* x, int* y, int* width, int* height); 2382c8263e704135436f71a585801966294d6deadeebepoger@google.comvoid get_preferred_size(int* x, int* y, int* width, int* height) { 2383c8263e704135436f71a585801966294d6deadeebepoger@google.com *x = 10; 2384c8263e704135436f71a585801966294d6deadeebepoger@google.com *y = 50; 2385c8263e704135436f71a585801966294d6deadeebepoger@google.com *width = 640; 238685195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org *height = 480; 238785195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org} 238885195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org 238985195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org#ifdef SK_BUILD_FOR_IOS 239085195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.orgIOS_launch_type set_cmd_line_args(int , char *[], const char* resourceDir) { 239185195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org SetResourcePath(resourceDir); 239285195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org return kApplication__iOSLaunchType; 239385195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org} 239485195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org#endif 239585195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org 239685195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.orgvoid application_init() { 2397310478e72c63e639373465216271b81f1e4a9136epoger@google.com// setenv("ANDROID_ROOT", "../../../data", 0); 2398310478e72c63e639373465216271b81f1e4a9136epoger@google.com#ifdef SK_BUILD_FOR_MAC 239951dbabee67ea1285e1115e535d26944d4da99be5epoger@google.com setenv("ANDROID_ROOT", "/android/device/data", 0); 24002b3a204bf68c9e41e62e0f2db5dfe263ea811424commit-bot@chromium.org#endif 24012b3a204bf68c9e41e62e0f2db5dfe263ea811424commit-bot@chromium.org SkGraphics::Init(); 24022b3a204bf68c9e41e62e0f2db5dfe263ea811424commit-bot@chromium.org SkEvent::Init(); 24032b3a204bf68c9e41e62e0f2db5dfe263ea811424commit-bot@chromium.org} 24042b3a204bf68c9e41e62e0f2db5dfe263ea811424commit-bot@chromium.org 240551dbabee67ea1285e1115e535d26944d4da99be5epoger@google.comvoid application_term() { 240651dbabee67ea1285e1115e535d26944d4da99be5epoger@google.com SkEvent::Term(); 24075f9f2f574fe9b195f5f3e40edeb2e28b673511fdrobertphillips@google.com SkGraphics::Term(); 240807947d95657743a9c4c3bfec31e1205eb81e5910epoger@google.com} 240907947d95657743a9c4c3bfec31e1205eb81e5910epoger@google.com