1411bb7237e5148dc398ae0f3e53ea5f2eb4402decaryclark@google.com/* 2451bb9f801d668275394ca5bd57f238e13cf3d17keyar@chromium.org * Copyright 2012 Google Inc. 3451bb9f801d668275394ca5bd57f238e13cf3d17keyar@chromium.org * 4451bb9f801d668275394ca5bd57f238e13cf3d17keyar@chromium.org * Use of this source code is governed by a BSD-style license that can be 5451bb9f801d668275394ca5bd57f238e13cf3d17keyar@chromium.org * found in the LICENSE file. 6451bb9f801d668275394ca5bd57f238e13cf3d17keyar@chromium.org */ 7451bb9f801d668275394ca5bd57f238e13cf3d17keyar@chromium.org 8451bb9f801d668275394ca5bd57f238e13cf3d17keyar@chromium.org#ifndef PictureRenderer_DEFINED 9451bb9f801d668275394ca5bd57f238e13cf3d17keyar@chromium.org#define PictureRenderer_DEFINED 10a62da2fee72172a630c2d1dba0e529b357743662scroggo@google.com 11161e1ba4c0a82e21c7d68808529699fd2394ad6cscroggo@google.com#include "SkCanvas.h" 12a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com#include "SkDrawFilter.h" 134d1a364e391a8fd79c9e133d27957761d35068d0kelvinly#include "SkJSONCPP.h" 14f4959ab11827bef99e8985031feb457cae1f987akeyar@chromium.org#include "SkMath.h" 15ea6a306457e23d579ee86cd705c83e4e1e0693c3reed@google.com#include "SkPaint.h" 169a4125283ad56cea3b986337cb669dde14bf0ed8scroggo@google.com#include "SkPicture.h" 17770963f23f4fc313db0fa3bac18b1b8aafb55f17robertphillips@google.com#include "SkPictureRecorder.h" 18acfb30e5bb797249f4ec41edda4c4d4b86e0e5d0scroggo@google.com#include "SkRect.h" 19451bb9f801d668275394ca5bd57f238e13cf3d17keyar@chromium.org#include "SkRefCnt.h" 209a4125283ad56cea3b986337cb669dde14bf0ed8scroggo@google.com#include "SkString.h" 21a62da2fee72172a630c2d1dba0e529b357743662scroggo@google.com#include "SkTDArray.h" 22a62da2fee72172a630c2d1dba0e529b357743662scroggo@google.com#include "SkTypes.h" 23451bb9f801d668275394ca5bd57f238e13cf3d17keyar@chromium.org 240612564bb76ec533d26d87e03368fd81ef97831ekeyar@chromium.org#if SK_SUPPORT_GPU 250612564bb76ec533d26d87e03368fd81ef97831ekeyar@chromium.org#include "GrContextFactory.h" 260612564bb76ec533d26d87e03368fd81ef97831ekeyar@chromium.org#include "GrContext.h" 270612564bb76ec533d26d87e03368fd81ef97831ekeyar@chromium.org#endif 280612564bb76ec533d26d87e03368fd81ef97831ekeyar@chromium.org 2990c0fbd34947b6b644e90c5b2253752035f65b64commit-bot@chromium.org#include "image_expectations.h" 3090c0fbd34947b6b644e90c5b2253752035f65b64commit-bot@chromium.org 31451bb9f801d668275394ca5bd57f238e13cf3d17keyar@chromium.orgclass SkBitmap; 32451bb9f801d668275394ca5bd57f238e13cf3d17keyar@chromium.orgclass SkCanvas; 336177e6999d23a4268ffd98dedfb1da00e272a89brobertphillips@google.comclass SkGLContextHelper; 34a62da2fee72172a630c2d1dba0e529b357743662scroggo@google.comclass SkThread; 35451bb9f801d668275394ca5bd57f238e13cf3d17keyar@chromium.org 36451bb9f801d668275394ca5bd57f238e13cf3d17keyar@chromium.orgnamespace sk_tools { 37451bb9f801d668275394ca5bd57f238e13cf3d17keyar@chromium.org 38cbcef708914f3b5e9bb63ad3d87261378026e29bscroggo@google.comclass TiledPictureRenderer; 39cbcef708914f3b5e9bb63ad3d87261378026e29bscroggo@google.com 40451bb9f801d668275394ca5bd57f238e13cf3d17keyar@chromium.orgclass PictureRenderer : public SkRefCnt { 41cbcef708914f3b5e9bb63ad3d87261378026e29bscroggo@google.com 42451bb9f801d668275394ca5bd57f238e13cf3d17keyar@chromium.orgpublic: 43c81686cd6edba2cfedcfd5ad6a164f160ddfb49fkeyar@chromium.org enum SkDeviceTypes { 440556ea0ede7066b9b3ed9f03f5a6eb72cd718897scroggo@google.com#if SK_ANGLE 450556ea0ede7066b9b3ed9f03f5a6eb72cd718897scroggo@google.com kAngle_DeviceType, 460556ea0ede7066b9b3ed9f03f5a6eb72cd718897scroggo@google.com#endif 476ab96733b85cebac99b378f998cd7dc10b286395rmistry@google.com#if SK_MESA 486ab96733b85cebac99b378f998cd7dc10b286395rmistry@google.com kMesa_DeviceType, 496ab96733b85cebac99b378f998cd7dc10b286395rmistry@google.com#endif 50c81686cd6edba2cfedcfd5ad6a164f160ddfb49fkeyar@chromium.org kBitmap_DeviceType, 51c81686cd6edba2cfedcfd5ad6a164f160ddfb49fkeyar@chromium.org#if SK_SUPPORT_GPU 520556ea0ede7066b9b3ed9f03f5a6eb72cd718897scroggo@google.com kGPU_DeviceType, 530fd5270ad69f5b99852d544158c989d2deda2c11commit-bot@chromium.org kNVPR_DeviceType, 54c81686cd6edba2cfedcfd5ad6a164f160ddfb49fkeyar@chromium.org#endif 55c81686cd6edba2cfedcfd5ad6a164f160ddfb49fkeyar@chromium.org }; 56c81686cd6edba2cfedcfd5ad6a164f160ddfb49fkeyar@chromium.org 579313ca4bde606a18f29214eea8b8e47312b8fd9cjunov@chromium.org enum BBoxHierarchyType { 589313ca4bde606a18f29214eea8b8e47312b8fd9cjunov@chromium.org kNone_BBoxHierarchyType = 0, 599313ca4bde606a18f29214eea8b8e47312b8fd9cjunov@chromium.org kRTree_BBoxHierarchyType, 607b53706a7d596a2d8dce6cfe5b543264e5a37239junov@chromium.org kTileGrid_BBoxHierarchyType, 61cdd0f92b1aca0c2164ac1a24d7f14a6ad3cc10f5commit-bot@chromium.org 62cdd0f92b1aca0c2164ac1a24d7f14a6ad3cc10f5commit-bot@chromium.org kLast_BBoxHierarchyType = kTileGrid_BBoxHierarchyType, 639313ca4bde606a18f29214eea8b8e47312b8fd9cjunov@chromium.org }; 649313ca4bde606a18f29214eea8b8e47312b8fd9cjunov@chromium.org 65a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com // this uses SkPaint::Flags as a base and adds additional flags 66a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com enum DrawFilterFlags { 67a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com kNone_DrawFilterFlag = 0, 68881b10b023bcba3c81f1d9e98e62b7b6855b0f11reed@google.com kHinting_DrawFilterFlag = 0x10000, // toggles between no hinting and normal hinting 69881b10b023bcba3c81f1d9e98e62b7b6855b0f11reed@google.com kSlightHinting_DrawFilterFlag = 0x20000, // toggles between slight and normal hinting 70881b10b023bcba3c81f1d9e98e62b7b6855b0f11reed@google.com kAAClip_DrawFilterFlag = 0x40000, // toggles between soft and hard clip 71387db0a2e516ca01508f7d16433f84da2ea3b93bhumper@google.com kMaskFilter_DrawFilterFlag = 0x80000, // toggles on/off mask filters (e.g., blurs) 72a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com }; 73a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com 74491493119c11206c5823b76eb6420a705be243a1robertphillips@google.com SK_COMPILE_ASSERT(!(kMaskFilter_DrawFilterFlag & SkPaint::kAllFlags), maskfilter_flag_must_be_greater); 75a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com SK_COMPILE_ASSERT(!(kHinting_DrawFilterFlag & SkPaint::kAllFlags), 76a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com hinting_flag_must_be_greater); 77a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com SK_COMPILE_ASSERT(!(kSlightHinting_DrawFilterFlag & SkPaint::kAllFlags), 78a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com slight_hinting_flag_must_be_greater); 79a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com 80a62da2fee72172a630c2d1dba0e529b357743662scroggo@google.com /** 81a62da2fee72172a630c2d1dba0e529b357743662scroggo@google.com * Called with each new SkPicture to render. 82f5e315ccf1ae2941f7cf53fa53e5c8c4bb665fe1commit-bot@chromium.org * 83f5e315ccf1ae2941f7cf53fa53e5c8c4bb665fe1commit-bot@chromium.org * @param pict The SkPicture to render. 843f0451772109959fcb79bacf2c9a03e0eb39ff27commit-bot@chromium.org * @param writePath The output directory within which this renderer should write all images, 853f0451772109959fcb79bacf2c9a03e0eb39ff27commit-bot@chromium.org * or NULL if this renderer should not write all images. 863f0451772109959fcb79bacf2c9a03e0eb39ff27commit-bot@chromium.org * @param mismatchPath The output directory within which this renderer should write any images 873f0451772109959fcb79bacf2c9a03e0eb39ff27commit-bot@chromium.org * which do not match expectations, or NULL if this renderer should not write mismatches. 88f5e315ccf1ae2941f7cf53fa53e5c8c4bb665fe1commit-bot@chromium.org * @param inputFilename The name of the input file we are rendering. 89f5e315ccf1ae2941f7cf53fa53e5c8c4bb665fe1commit-bot@chromium.org * @param useChecksumBasedFilenames Whether to use checksum-based filenames when writing 90f5e315ccf1ae2941f7cf53fa53e5c8c4bb665fe1commit-bot@chromium.org * bitmap images to disk. 91a62da2fee72172a630c2d1dba0e529b357743662scroggo@google.com */ 922a65a238b0e688356aee09d08f3f8a317359b4d2mtklein virtual void init(const SkPicture* pict, 932a65a238b0e688356aee09d08f3f8a317359b4d2mtklein const SkString* writePath, 94ce4dd3de38cd7c29bf5b9d8a8efb55c08ec9be47robertphillips const SkString* mismatchPath, 952a65a238b0e688356aee09d08f3f8a317359b4d2mtklein const SkString* inputFilename, 96ce4dd3de38cd7c29bf5b9d8a8efb55c08ec9be47robertphillips bool useChecksumBasedFilenames); 979a4125283ad56cea3b986337cb669dde14bf0ed8scroggo@google.com 989a4125283ad56cea3b986337cb669dde14bf0ed8scroggo@google.com /** 998991c67f0c1b9364bb12dfb0f32a53bd5a3357f3commit-bot@chromium.org * TODO(epoger): Temporary hack, while we work on http://skbug.com/2584 ('bench_pictures is 1008991c67f0c1b9364bb12dfb0f32a53bd5a3357f3commit-bot@chromium.org * timing reading pixels and writing json files'), such that: 1018991c67f0c1b9364bb12dfb0f32a53bd5a3357f3commit-bot@chromium.org * - render_pictures can call this method and continue to work 1028991c67f0c1b9364bb12dfb0f32a53bd5a3357f3commit-bot@chromium.org * - any other callers (bench_pictures) will skip calls to write() by default 1038991c67f0c1b9364bb12dfb0f32a53bd5a3357f3commit-bot@chromium.org */ 1048991c67f0c1b9364bb12dfb0f32a53bd5a3357f3commit-bot@chromium.org void enableWrites() { fEnableWrites = true; } 1058991c67f0c1b9364bb12dfb0f32a53bd5a3357f3commit-bot@chromium.org 1068991c67f0c1b9364bb12dfb0f32a53bd5a3357f3commit-bot@chromium.org /** 107c0d5e549ab8d594a5da8db417db39622e9491fffscroggo@google.com * Set the viewport so that only the portion listed gets drawn. 108c0d5e549ab8d594a5da8db417db39622e9491fffscroggo@google.com */ 109c0d5e549ab8d594a5da8db417db39622e9491fffscroggo@google.com void setViewport(SkISize size) { fViewport = size; } 110c0d5e549ab8d594a5da8db417db39622e9491fffscroggo@google.com 111c0d5e549ab8d594a5da8db417db39622e9491fffscroggo@google.com /** 11282ec0b00f380906c1cdeb4b4cc4a355264ab3882scroggo@google.com * Set the scale factor at which draw the picture. 11382ec0b00f380906c1cdeb4b4cc4a355264ab3882scroggo@google.com */ 11482ec0b00f380906c1cdeb4b4cc4a355264ab3882scroggo@google.com void setScaleFactor(SkScalar scale) { fScaleFactor = scale; } 11582ec0b00f380906c1cdeb4b4cc4a355264ab3882scroggo@google.com 11682ec0b00f380906c1cdeb4b4cc4a355264ab3882scroggo@google.com /** 1179a4125283ad56cea3b986337cb669dde14bf0ed8scroggo@google.com * Perform any setup that should done prior to each iteration of render() which should not be 1189a4125283ad56cea3b986337cb669dde14bf0ed8scroggo@google.com * timed. 1199a4125283ad56cea3b986337cb669dde14bf0ed8scroggo@google.com */ 1209a4125283ad56cea3b986337cb669dde14bf0ed8scroggo@google.com virtual void setup() {} 1219a4125283ad56cea3b986337cb669dde14bf0ed8scroggo@google.com 1229a4125283ad56cea3b986337cb669dde14bf0ed8scroggo@google.com /** 123f5e315ccf1ae2941f7cf53fa53e5c8c4bb665fe1commit-bot@chromium.org * Perform the work. If this is being called within the context of bench_pictures, 124f5e315ccf1ae2941f7cf53fa53e5c8c4bb665fe1commit-bot@chromium.org * this is the step that will be timed. 125f5e315ccf1ae2941f7cf53fa53e5c8c4bb665fe1commit-bot@chromium.org * 126f5e315ccf1ae2941f7cf53fa53e5c8c4bb665fe1commit-bot@chromium.org * Typically "the work" is rendering an SkPicture into a bitmap, but in some subclasses 127f5e315ccf1ae2941f7cf53fa53e5c8c4bb665fe1commit-bot@chromium.org * it is recording the source SkPicture into another SkPicture. 128f5e315ccf1ae2941f7cf53fa53e5c8c4bb665fe1commit-bot@chromium.org * 1293f0451772109959fcb79bacf2c9a03e0eb39ff27commit-bot@chromium.org * If fWritePath has been specified, the result of the work will be written to that dir. 1303f0451772109959fcb79bacf2c9a03e0eb39ff27commit-bot@chromium.org * If fMismatchPath has been specified, and the actual image result differs from its 1313f0451772109959fcb79bacf2c9a03e0eb39ff27commit-bot@chromium.org * expectation, the result of the work will be written to that dir. 132f5e315ccf1ae2941f7cf53fa53e5c8c4bb665fe1commit-bot@chromium.org * 133f5e315ccf1ae2941f7cf53fa53e5c8c4bb665fe1commit-bot@chromium.org * @param out If non-null, the implementing subclass MAY allocate an SkBitmap, copy the 134f5e315ccf1ae2941f7cf53fa53e5c8c4bb665fe1commit-bot@chromium.org * output image into it, and return it here. (Some subclasses ignore this parameter) 1353f0451772109959fcb79bacf2c9a03e0eb39ff27commit-bot@chromium.org * @return bool True if rendering succeeded and, if fWritePath had been specified, the output 136f5e315ccf1ae2941f7cf53fa53e5c8c4bb665fe1commit-bot@chromium.org * was successfully written to a file. 1379a4125283ad56cea3b986337cb669dde14bf0ed8scroggo@google.com */ 138f5e315ccf1ae2941f7cf53fa53e5c8c4bb665fe1commit-bot@chromium.org virtual bool render(SkBitmap** out = NULL) = 0; 1399a4125283ad56cea3b986337cb669dde14bf0ed8scroggo@google.com 140a62da2fee72172a630c2d1dba0e529b357743662scroggo@google.com /** 141a62da2fee72172a630c2d1dba0e529b357743662scroggo@google.com * Called once finished with a particular SkPicture, before calling init again, and before 142a62da2fee72172a630c2d1dba0e529b357743662scroggo@google.com * being done with this Renderer. 143a62da2fee72172a630c2d1dba0e529b357743662scroggo@google.com */ 1449d696c0d04548520af08252e577d2ca88012a239keyar@chromium.org virtual void end(); 145a62da2fee72172a630c2d1dba0e529b357743662scroggo@google.com 146cbcef708914f3b5e9bb63ad3d87261378026e29bscroggo@google.com /** 147cbcef708914f3b5e9bb63ad3d87261378026e29bscroggo@google.com * If this PictureRenderer is actually a TiledPictureRender, return a pointer to this as a 148cbcef708914f3b5e9bb63ad3d87261378026e29bscroggo@google.com * TiledPictureRender so its methods can be called. 149cbcef708914f3b5e9bb63ad3d87261378026e29bscroggo@google.com */ 150cbcef708914f3b5e9bb63ad3d87261378026e29bscroggo@google.com virtual TiledPictureRenderer* getTiledRenderer() { return NULL; } 151cbcef708914f3b5e9bb63ad3d87261378026e29bscroggo@google.com 15208085f808b808bfb14fcb247bb8cb1a5e8d43dccscroggo@google.com /** 15308085f808b808bfb14fcb247bb8cb1a5e8d43dccscroggo@google.com * Resets the GPU's state. Does nothing if the backing is raster. For a GPU renderer, calls 15451c040ed1e8c50bec4297bbe25242f644b40b0b7commit-bot@chromium.org * flush, swapBuffers and, if callFinish is true, finish. 15508085f808b808bfb14fcb247bb8cb1a5e8d43dccscroggo@google.com * @param callFinish Whether to call finish. 15608085f808b808bfb14fcb247bb8cb1a5e8d43dccscroggo@google.com */ 15708085f808b808bfb14fcb247bb8cb1a5e8d43dccscroggo@google.com void resetState(bool callFinish); 1589d696c0d04548520af08252e577d2ca88012a239keyar@chromium.org 1590556ea0ede7066b9b3ed9f03f5a6eb72cd718897scroggo@google.com /** 16094d8f1ed6116780346ffa39ed683f1977786434arobertphillips@google.com * Remove all decoded textures from the CPU caches and all uploaded textures 16194d8f1ed6116780346ffa39ed683f1977786434arobertphillips@google.com * from the GPU. 16294d8f1ed6116780346ffa39ed683f1977786434arobertphillips@google.com */ 16394d8f1ed6116780346ffa39ed683f1977786434arobertphillips@google.com void purgeTextures(); 16494d8f1ed6116780346ffa39ed683f1977786434arobertphillips@google.com 16594d8f1ed6116780346ffa39ed683f1977786434arobertphillips@google.com /** 1660556ea0ede7066b9b3ed9f03f5a6eb72cd718897scroggo@google.com * Set the backend type. Returns true on success and false on failure. 1670556ea0ede7066b9b3ed9f03f5a6eb72cd718897scroggo@google.com */ 16880549fcdd50269d7e069d6db02b395fca128056ckkinnunen#if SK_SUPPORT_GPU 16980549fcdd50269d7e069d6db02b395fca128056ckkinnunen bool setDeviceType(SkDeviceTypes deviceType, GrGLStandard gpuAPI = kNone_GrGLStandard) { 17080549fcdd50269d7e069d6db02b395fca128056ckkinnunen#else 1710556ea0ede7066b9b3ed9f03f5a6eb72cd718897scroggo@google.com bool setDeviceType(SkDeviceTypes deviceType) { 17280549fcdd50269d7e069d6db02b395fca128056ckkinnunen#endif 173c81686cd6edba2cfedcfd5ad6a164f160ddfb49fkeyar@chromium.org fDeviceType = deviceType; 1740556ea0ede7066b9b3ed9f03f5a6eb72cd718897scroggo@google.com#if SK_SUPPORT_GPU 1750556ea0ede7066b9b3ed9f03f5a6eb72cd718897scroggo@google.com // In case this function is called more than once 1760556ea0ede7066b9b3ed9f03f5a6eb72cd718897scroggo@google.com SkSafeUnref(fGrContext); 1770556ea0ede7066b9b3ed9f03f5a6eb72cd718897scroggo@google.com fGrContext = NULL; 1780556ea0ede7066b9b3ed9f03f5a6eb72cd718897scroggo@google.com // Set to Native so it will have an initial value. 1790556ea0ede7066b9b3ed9f03f5a6eb72cd718897scroggo@google.com GrContextFactory::GLContextType glContextType = GrContextFactory::kNative_GLContextType; 1800556ea0ede7066b9b3ed9f03f5a6eb72cd718897scroggo@google.com#endif 1810556ea0ede7066b9b3ed9f03f5a6eb72cd718897scroggo@google.com switch(deviceType) { 1820556ea0ede7066b9b3ed9f03f5a6eb72cd718897scroggo@google.com case kBitmap_DeviceType: 1830556ea0ede7066b9b3ed9f03f5a6eb72cd718897scroggo@google.com return true; 1840556ea0ede7066b9b3ed9f03f5a6eb72cd718897scroggo@google.com#if SK_SUPPORT_GPU 1850556ea0ede7066b9b3ed9f03f5a6eb72cd718897scroggo@google.com case kGPU_DeviceType: 1860556ea0ede7066b9b3ed9f03f5a6eb72cd718897scroggo@google.com // Already set to GrContextFactory::kNative_GLContextType, above. 1870556ea0ede7066b9b3ed9f03f5a6eb72cd718897scroggo@google.com break; 1880fd5270ad69f5b99852d544158c989d2deda2c11commit-bot@chromium.org case kNVPR_DeviceType: 1890fd5270ad69f5b99852d544158c989d2deda2c11commit-bot@chromium.org glContextType = GrContextFactory::kNVPR_GLContextType; 1900fd5270ad69f5b99852d544158c989d2deda2c11commit-bot@chromium.org break; 1910556ea0ede7066b9b3ed9f03f5a6eb72cd718897scroggo@google.com#if SK_ANGLE 1920556ea0ede7066b9b3ed9f03f5a6eb72cd718897scroggo@google.com case kAngle_DeviceType: 1930556ea0ede7066b9b3ed9f03f5a6eb72cd718897scroggo@google.com glContextType = GrContextFactory::kANGLE_GLContextType; 1940556ea0ede7066b9b3ed9f03f5a6eb72cd718897scroggo@google.com break; 1950556ea0ede7066b9b3ed9f03f5a6eb72cd718897scroggo@google.com#endif 1966ab96733b85cebac99b378f998cd7dc10b286395rmistry@google.com#if SK_MESA 1976ab96733b85cebac99b378f998cd7dc10b286395rmistry@google.com case kMesa_DeviceType: 1986ab96733b85cebac99b378f998cd7dc10b286395rmistry@google.com glContextType = GrContextFactory::kMESA_GLContextType; 1996ab96733b85cebac99b378f998cd7dc10b286395rmistry@google.com break; 2006ab96733b85cebac99b378f998cd7dc10b286395rmistry@google.com#endif 2010556ea0ede7066b9b3ed9f03f5a6eb72cd718897scroggo@google.com#endif 2020556ea0ede7066b9b3ed9f03f5a6eb72cd718897scroggo@google.com default: 2030556ea0ede7066b9b3ed9f03f5a6eb72cd718897scroggo@google.com // Invalid device type. 2040556ea0ede7066b9b3ed9f03f5a6eb72cd718897scroggo@google.com return false; 2050556ea0ede7066b9b3ed9f03f5a6eb72cd718897scroggo@google.com } 2060556ea0ede7066b9b3ed9f03f5a6eb72cd718897scroggo@google.com#if SK_SUPPORT_GPU 20780549fcdd50269d7e069d6db02b395fca128056ckkinnunen fGrContext = fGrContextFactory.get(glContextType, gpuAPI); 2080556ea0ede7066b9b3ed9f03f5a6eb72cd718897scroggo@google.com if (NULL == fGrContext) { 2090556ea0ede7066b9b3ed9f03f5a6eb72cd718897scroggo@google.com return false; 2100556ea0ede7066b9b3ed9f03f5a6eb72cd718897scroggo@google.com } else { 2110556ea0ede7066b9b3ed9f03f5a6eb72cd718897scroggo@google.com fGrContext->ref(); 2120556ea0ede7066b9b3ed9f03f5a6eb72cd718897scroggo@google.com return true; 2130556ea0ede7066b9b3ed9f03f5a6eb72cd718897scroggo@google.com } 2140556ea0ede7066b9b3ed9f03f5a6eb72cd718897scroggo@google.com#endif 215fe6391a624f98b1c70581ac86d5733afe11872d3keyar@chromium.org } 216fe6391a624f98b1c70581ac86d5733afe11872d3keyar@chromium.org 217f6a90332ae21414cf19630764d4371ffd24ac0ccjvanverth@google.com#if SK_SUPPORT_GPU 218f6a90332ae21414cf19630764d4371ffd24ac0ccjvanverth@google.com void setSampleCount(int sampleCount) { 219f6a90332ae21414cf19630764d4371ffd24ac0ccjvanverth@google.com fSampleCount = sampleCount; 220f6a90332ae21414cf19630764d4371ffd24ac0ccjvanverth@google.com } 221f6a90332ae21414cf19630764d4371ffd24ac0ccjvanverth@google.com#endif 222f6a90332ae21414cf19630764d4371ffd24ac0ccjvanverth@google.com 223e3e940cf81dc46d872002ded98c1bd39c2daf1b0caryclark@google.com void setDrawFilters(DrawFilterFlags const * const filters, const SkString& configName) { 224e3e940cf81dc46d872002ded98c1bd39c2daf1b0caryclark@google.com memcpy(fDrawFilters, filters, sizeof(fDrawFilters)); 225a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com fDrawFiltersConfig = configName; 226a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com } 227a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com 2289313ca4bde606a18f29214eea8b8e47312b8fd9cjunov@chromium.org void setBBoxHierarchyType(BBoxHierarchyType bbhType) { 2299313ca4bde606a18f29214eea8b8e47312b8fd9cjunov@chromium.org fBBoxHierarchyType = bbhType; 2309313ca4bde606a18f29214eea8b8e47312b8fd9cjunov@chromium.org } 2319313ca4bde606a18f29214eea8b8e47312b8fd9cjunov@chromium.org 232e286e84a6a23f8a4c81708c1a19c9561f355c720junov@chromium.org BBoxHierarchyType getBBoxHierarchyType() { return fBBoxHierarchyType; } 233e286e84a6a23f8a4c81708c1a19c9561f355c720junov@chromium.org 2347b53706a7d596a2d8dce6cfe5b543264e5a37239junov@chromium.org void setGridSize(int width, int height) { 23529b19e53cfac5af4f9bd5d361436d1097f349a34junov@chromium.org fGridInfo.fTileInterval.set(width, height); 2367b53706a7d596a2d8dce6cfe5b543264e5a37239junov@chromium.org } 2377b53706a7d596a2d8dce6cfe5b543264e5a37239junov@chromium.org 238205ce48c38c55ec7527d26042b5cea689369be8bcommit-bot@chromium.org void setJsonSummaryPtr(ImageResultsAndExpectations* jsonSummaryPtr) { 239a3f882c4756bd8b9b6449dcc60b6d884ee0cc8edcommit-bot@chromium.org fJsonSummaryPtr = jsonSummaryPtr; 240a3f882c4756bd8b9b6449dcc60b6d884ee0cc8edcommit-bot@chromium.org } 241a3f882c4756bd8b9b6449dcc60b6d884ee0cc8edcommit-bot@chromium.org 242fe6391a624f98b1c70581ac86d5733afe11872d3keyar@chromium.org bool isUsingBitmapDevice() { 24378a35c5f1dcc00b2b442069a94f9e7c996f8d7f9keyar@chromium.org return kBitmap_DeviceType == fDeviceType; 2444ea96c5e5449248780acfeb3cef4ec812f955d74keyar@chromium.org } 2454ea96c5e5449248780acfeb3cef4ec812f955d74keyar@chromium.org 2469a4125283ad56cea3b986337cb669dde14bf0ed8scroggo@google.com virtual SkString getPerIterTimeFormat() { return SkString("%.2f"); } 2479a4125283ad56cea3b986337cb669dde14bf0ed8scroggo@google.com 2489a4125283ad56cea3b986337cb669dde14bf0ed8scroggo@google.com virtual SkString getNormalTimeFormat() { return SkString("%6.2f"); } 2499a4125283ad56cea3b986337cb669dde14bf0ed8scroggo@google.com 2500a049b861e18c9c1ede865b8acbcbedc3dd10b43scroggo@google.com /** 2510a049b861e18c9c1ede865b8acbcbedc3dd10b43scroggo@google.com * Reports the configuration of this PictureRenderer. 2520a049b861e18c9c1ede865b8acbcbedc3dd10b43scroggo@google.com */ 2530a049b861e18c9c1ede865b8acbcbedc3dd10b43scroggo@google.com SkString getConfigName() { 2540a049b861e18c9c1ede865b8acbcbedc3dd10b43scroggo@google.com SkString config = this->getConfigNameInternal(); 255c4013c199cae88684846b0f798c4d80fbcf19d63scroggo@google.com if (!fViewport.isEmpty()) { 256c4013c199cae88684846b0f798c4d80fbcf19d63scroggo@google.com config.appendf("_viewport_%ix%i", fViewport.width(), fViewport.height()); 257c4013c199cae88684846b0f798c4d80fbcf19d63scroggo@google.com } 2589de35eb37513836ddef147fd48fb1aacf60a7e51commit-bot@chromium.org if (fScaleFactor != SK_Scalar1) { 2599de35eb37513836ddef147fd48fb1aacf60a7e51commit-bot@chromium.org config.appendf("_scalar_%f", SkScalarToFloat(fScaleFactor)); 2609de35eb37513836ddef147fd48fb1aacf60a7e51commit-bot@chromium.org } 2610a049b861e18c9c1ede865b8acbcbedc3dd10b43scroggo@google.com if (kRTree_BBoxHierarchyType == fBBoxHierarchyType) { 2620a049b861e18c9c1ede865b8acbcbedc3dd10b43scroggo@google.com config.append("_rtree"); 2637b53706a7d596a2d8dce6cfe5b543264e5a37239junov@chromium.org } else if (kTileGrid_BBoxHierarchyType == fBBoxHierarchyType) { 2647b53706a7d596a2d8dce6cfe5b543264e5a37239junov@chromium.org config.append("_grid"); 26506fdc6937df52942226a0a5e7bba169c27006ef1kelvinly config.append("_"); 26606fdc6937df52942226a0a5e7bba169c27006ef1kelvinly config.appendS32(fGridInfo.fTileInterval.width()); 26706fdc6937df52942226a0a5e7bba169c27006ef1kelvinly config.append("x"); 26806fdc6937df52942226a0a5e7bba169c27006ef1kelvinly config.appendS32(fGridInfo.fTileInterval.height()); 2690a049b861e18c9c1ede865b8acbcbedc3dd10b43scroggo@google.com } 2700a049b861e18c9c1ede865b8acbcbedc3dd10b43scroggo@google.com#if SK_SUPPORT_GPU 271e8fe4bc3efa8f18f5651c5d005fba1935a741be0robertphillips@google.com switch (fDeviceType) { 2720556ea0ede7066b9b3ed9f03f5a6eb72cd718897scroggo@google.com case kGPU_DeviceType: 273f6a90332ae21414cf19630764d4371ffd24ac0ccjvanverth@google.com if (fSampleCount) { 274f6a90332ae21414cf19630764d4371ffd24ac0ccjvanverth@google.com config.appendf("_msaa%d", fSampleCount); 275f6a90332ae21414cf19630764d4371ffd24ac0ccjvanverth@google.com } else { 276f6a90332ae21414cf19630764d4371ffd24ac0ccjvanverth@google.com config.append("_gpu"); 277f6a90332ae21414cf19630764d4371ffd24ac0ccjvanverth@google.com } 2780556ea0ede7066b9b3ed9f03f5a6eb72cd718897scroggo@google.com break; 2790fd5270ad69f5b99852d544158c989d2deda2c11commit-bot@chromium.org case kNVPR_DeviceType: 2800fd5270ad69f5b99852d544158c989d2deda2c11commit-bot@chromium.org config.appendf("_nvprmsaa%d", fSampleCount); 2810fd5270ad69f5b99852d544158c989d2deda2c11commit-bot@chromium.org break; 2820556ea0ede7066b9b3ed9f03f5a6eb72cd718897scroggo@google.com#if SK_ANGLE 2830556ea0ede7066b9b3ed9f03f5a6eb72cd718897scroggo@google.com case kAngle_DeviceType: 2840556ea0ede7066b9b3ed9f03f5a6eb72cd718897scroggo@google.com config.append("_angle"); 2850556ea0ede7066b9b3ed9f03f5a6eb72cd718897scroggo@google.com break; 2860556ea0ede7066b9b3ed9f03f5a6eb72cd718897scroggo@google.com#endif 2876ab96733b85cebac99b378f998cd7dc10b286395rmistry@google.com#if SK_MESA 2886ab96733b85cebac99b378f998cd7dc10b286395rmistry@google.com case kMesa_DeviceType: 2896ab96733b85cebac99b378f998cd7dc10b286395rmistry@google.com config.append("_mesa"); 2906ab96733b85cebac99b378f998cd7dc10b286395rmistry@google.com break; 2916ab96733b85cebac99b378f998cd7dc10b286395rmistry@google.com#endif 2920556ea0ede7066b9b3ed9f03f5a6eb72cd718897scroggo@google.com default: 2930556ea0ede7066b9b3ed9f03f5a6eb72cd718897scroggo@google.com // Assume that no extra info means bitmap. 2940556ea0ede7066b9b3ed9f03f5a6eb72cd718897scroggo@google.com break; 2950556ea0ede7066b9b3ed9f03f5a6eb72cd718897scroggo@google.com } 296e8fe4bc3efa8f18f5651c5d005fba1935a741be0robertphillips@google.com#endif 297a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com config.append(fDrawFiltersConfig.c_str()); 2980a049b861e18c9c1ede865b8acbcbedc3dd10b43scroggo@google.com return config; 2990a049b861e18c9c1ede865b8acbcbedc3dd10b43scroggo@google.com } 3000a049b861e18c9c1ede865b8acbcbedc3dd10b43scroggo@google.com 3014d1a364e391a8fd79c9e133d27957761d35068d0kelvinly Json::Value getJSONConfig() { 3024d1a364e391a8fd79c9e133d27957761d35068d0kelvinly Json::Value result; 3034d1a364e391a8fd79c9e133d27957761d35068d0kelvinly 3044d1a364e391a8fd79c9e133d27957761d35068d0kelvinly result["mode"] = this->getConfigNameInternal().c_str(); 3054d1a364e391a8fd79c9e133d27957761d35068d0kelvinly result["scale"] = 1.0f; 3064d1a364e391a8fd79c9e133d27957761d35068d0kelvinly if (SK_Scalar1 != fScaleFactor) { 3074d1a364e391a8fd79c9e133d27957761d35068d0kelvinly result["scale"] = SkScalarToFloat(fScaleFactor); 3084d1a364e391a8fd79c9e133d27957761d35068d0kelvinly } 3094d1a364e391a8fd79c9e133d27957761d35068d0kelvinly if (kRTree_BBoxHierarchyType == fBBoxHierarchyType) { 3104d1a364e391a8fd79c9e133d27957761d35068d0kelvinly result["bbh"] = "rtree"; 3114d1a364e391a8fd79c9e133d27957761d35068d0kelvinly } else if (kTileGrid_BBoxHierarchyType == fBBoxHierarchyType) { 3124d1a364e391a8fd79c9e133d27957761d35068d0kelvinly SkString tmp("grid_"); 3134d1a364e391a8fd79c9e133d27957761d35068d0kelvinly tmp.appendS32(fGridInfo.fTileInterval.width()); 3144d1a364e391a8fd79c9e133d27957761d35068d0kelvinly tmp.append("x"); 3154d1a364e391a8fd79c9e133d27957761d35068d0kelvinly tmp.appendS32(fGridInfo.fTileInterval.height()); 3164d1a364e391a8fd79c9e133d27957761d35068d0kelvinly result["bbh"] = tmp.c_str(); 3174d1a364e391a8fd79c9e133d27957761d35068d0kelvinly } 3184d1a364e391a8fd79c9e133d27957761d35068d0kelvinly#if SK_SUPPORT_GPU 3194d1a364e391a8fd79c9e133d27957761d35068d0kelvinly SkString tmp; 3204d1a364e391a8fd79c9e133d27957761d35068d0kelvinly switch (fDeviceType) { 3214d1a364e391a8fd79c9e133d27957761d35068d0kelvinly case kGPU_DeviceType: 3224d1a364e391a8fd79c9e133d27957761d35068d0kelvinly if (0 != fSampleCount) { 3234d1a364e391a8fd79c9e133d27957761d35068d0kelvinly tmp = "msaa"; 3244d1a364e391a8fd79c9e133d27957761d35068d0kelvinly tmp.appendS32(fSampleCount); 3254d1a364e391a8fd79c9e133d27957761d35068d0kelvinly result["config"] = tmp.c_str(); 3264d1a364e391a8fd79c9e133d27957761d35068d0kelvinly } else { 3274d1a364e391a8fd79c9e133d27957761d35068d0kelvinly result["config"] = "gpu"; 3284d1a364e391a8fd79c9e133d27957761d35068d0kelvinly } 3294d1a364e391a8fd79c9e133d27957761d35068d0kelvinly break; 3304d1a364e391a8fd79c9e133d27957761d35068d0kelvinly case kNVPR_DeviceType: 3314d1a364e391a8fd79c9e133d27957761d35068d0kelvinly tmp = "nvprmsaa"; 3324d1a364e391a8fd79c9e133d27957761d35068d0kelvinly tmp.appendS32(fSampleCount); 3334d1a364e391a8fd79c9e133d27957761d35068d0kelvinly result["config"] = tmp.c_str(); 3344d1a364e391a8fd79c9e133d27957761d35068d0kelvinly break; 3354d1a364e391a8fd79c9e133d27957761d35068d0kelvinly#if SK_ANGLE 3364d1a364e391a8fd79c9e133d27957761d35068d0kelvinly case kAngle_DeviceType: 3374d1a364e391a8fd79c9e133d27957761d35068d0kelvinly result["config"] = "angle"; 3384d1a364e391a8fd79c9e133d27957761d35068d0kelvinly break; 3394d1a364e391a8fd79c9e133d27957761d35068d0kelvinly#endif 3404d1a364e391a8fd79c9e133d27957761d35068d0kelvinly#if SK_MESA 3414d1a364e391a8fd79c9e133d27957761d35068d0kelvinly case kMesa_DeviceType: 3424d1a364e391a8fd79c9e133d27957761d35068d0kelvinly result["config"] = "mesa"; 3434d1a364e391a8fd79c9e133d27957761d35068d0kelvinly break; 3444d1a364e391a8fd79c9e133d27957761d35068d0kelvinly#endif 3454d1a364e391a8fd79c9e133d27957761d35068d0kelvinly default: 3464d1a364e391a8fd79c9e133d27957761d35068d0kelvinly // Assume that no extra info means bitmap. 3474d1a364e391a8fd79c9e133d27957761d35068d0kelvinly break; 3484d1a364e391a8fd79c9e133d27957761d35068d0kelvinly } 3494d1a364e391a8fd79c9e133d27957761d35068d0kelvinly#endif 3504d1a364e391a8fd79c9e133d27957761d35068d0kelvinly return result; 3514d1a364e391a8fd79c9e133d27957761d35068d0kelvinly } 3524d1a364e391a8fd79c9e133d27957761d35068d0kelvinly 3534ea96c5e5449248780acfeb3cef4ec812f955d74keyar@chromium.org#if SK_SUPPORT_GPU 354fe6391a624f98b1c70581ac86d5733afe11872d3keyar@chromium.org bool isUsingGpuDevice() { 3550556ea0ede7066b9b3ed9f03f5a6eb72cd718897scroggo@google.com switch (fDeviceType) { 3560556ea0ede7066b9b3ed9f03f5a6eb72cd718897scroggo@google.com case kGPU_DeviceType: 3570fd5270ad69f5b99852d544158c989d2deda2c11commit-bot@chromium.org case kNVPR_DeviceType: 3580556ea0ede7066b9b3ed9f03f5a6eb72cd718897scroggo@google.com // fall through 3590556ea0ede7066b9b3ed9f03f5a6eb72cd718897scroggo@google.com#if SK_ANGLE 3600556ea0ede7066b9b3ed9f03f5a6eb72cd718897scroggo@google.com case kAngle_DeviceType: 3616ab96733b85cebac99b378f998cd7dc10b286395rmistry@google.com // fall through 3626ab96733b85cebac99b378f998cd7dc10b286395rmistry@google.com#endif 3636ab96733b85cebac99b378f998cd7dc10b286395rmistry@google.com#if SK_MESA 3646ab96733b85cebac99b378f998cd7dc10b286395rmistry@google.com case kMesa_DeviceType: 3650556ea0ede7066b9b3ed9f03f5a6eb72cd718897scroggo@google.com#endif 3660556ea0ede7066b9b3ed9f03f5a6eb72cd718897scroggo@google.com return true; 3670556ea0ede7066b9b3ed9f03f5a6eb72cd718897scroggo@google.com default: 3680556ea0ede7066b9b3ed9f03f5a6eb72cd718897scroggo@google.com return false; 3690556ea0ede7066b9b3ed9f03f5a6eb72cd718897scroggo@google.com } 370fe6391a624f98b1c70581ac86d5733afe11872d3keyar@chromium.org } 37177a5522d0e4437ef2b856acd7b135b6afda64ceekeyar@chromium.org 3726177e6999d23a4268ffd98dedfb1da00e272a89brobertphillips@google.com SkGLContextHelper* getGLContext() { 3730556ea0ede7066b9b3ed9f03f5a6eb72cd718897scroggo@google.com GrContextFactory::GLContextType glContextType 3740556ea0ede7066b9b3ed9f03f5a6eb72cd718897scroggo@google.com = GrContextFactory::kNull_GLContextType; 3750556ea0ede7066b9b3ed9f03f5a6eb72cd718897scroggo@google.com switch(fDeviceType) { 3760556ea0ede7066b9b3ed9f03f5a6eb72cd718897scroggo@google.com case kGPU_DeviceType: 3770556ea0ede7066b9b3ed9f03f5a6eb72cd718897scroggo@google.com glContextType = GrContextFactory::kNative_GLContextType; 3780556ea0ede7066b9b3ed9f03f5a6eb72cd718897scroggo@google.com break; 3790fd5270ad69f5b99852d544158c989d2deda2c11commit-bot@chromium.org case kNVPR_DeviceType: 3800fd5270ad69f5b99852d544158c989d2deda2c11commit-bot@chromium.org glContextType = GrContextFactory::kNVPR_GLContextType; 3810fd5270ad69f5b99852d544158c989d2deda2c11commit-bot@chromium.org break; 3820556ea0ede7066b9b3ed9f03f5a6eb72cd718897scroggo@google.com#if SK_ANGLE 3830556ea0ede7066b9b3ed9f03f5a6eb72cd718897scroggo@google.com case kAngle_DeviceType: 3840556ea0ede7066b9b3ed9f03f5a6eb72cd718897scroggo@google.com glContextType = GrContextFactory::kANGLE_GLContextType; 3850556ea0ede7066b9b3ed9f03f5a6eb72cd718897scroggo@google.com break; 3860556ea0ede7066b9b3ed9f03f5a6eb72cd718897scroggo@google.com#endif 3876ab96733b85cebac99b378f998cd7dc10b286395rmistry@google.com#if SK_MESA 3886ab96733b85cebac99b378f998cd7dc10b286395rmistry@google.com case kMesa_DeviceType: 3896ab96733b85cebac99b378f998cd7dc10b286395rmistry@google.com glContextType = GrContextFactory::kMESA_GLContextType; 3906ab96733b85cebac99b378f998cd7dc10b286395rmistry@google.com break; 3916ab96733b85cebac99b378f998cd7dc10b286395rmistry@google.com#endif 3920556ea0ede7066b9b3ed9f03f5a6eb72cd718897scroggo@google.com default: 3930556ea0ede7066b9b3ed9f03f5a6eb72cd718897scroggo@google.com return NULL; 39477a5522d0e4437ef2b856acd7b135b6afda64ceekeyar@chromium.org } 3950556ea0ede7066b9b3ed9f03f5a6eb72cd718897scroggo@google.com return fGrContextFactory.getGLContext(glContextType); 39677a5522d0e4437ef2b856acd7b135b6afda64ceekeyar@chromium.org } 397163c84ba5026907fea7b4f4bdcf8b16c13103adcrobertphillips@google.com 398163c84ba5026907fea7b4f4bdcf8b16c13103adcrobertphillips@google.com GrContext* getGrContext() { 399163c84ba5026907fea7b4f4bdcf8b16c13103adcrobertphillips@google.com return fGrContext; 400163c84ba5026907fea7b4f4bdcf8b16c13103adcrobertphillips@google.com } 401b1aded8edd1d809cded20ff546c6e9218b43cda4krajcevski 402b1aded8edd1d809cded20ff546c6e9218b43cda4krajcevski const GrContext::Options& getGrContextOptions() { 403b1aded8edd1d809cded20ff546c6e9218b43cda4krajcevski return fGrContextFactory.getGlobalOptions(); 404b1aded8edd1d809cded20ff546c6e9218b43cda4krajcevski } 4054ea96c5e5449248780acfeb3cef4ec812f955d74keyar@chromium.org#endif 4064ea96c5e5449248780acfeb3cef4ec812f955d74keyar@chromium.org 407145d1c0fdcef63991d7f910cc067a653a8aa2c4ccommit-bot@chromium.org SkCanvas* getCanvas() { 408145d1c0fdcef63991d7f910cc067a653a8aa2c4ccommit-bot@chromium.org return fCanvas; 409145d1c0fdcef63991d7f910cc067a653a8aa2c4ccommit-bot@chromium.org } 410145d1c0fdcef63991d7f910cc067a653a8aa2c4ccommit-bot@chromium.org 411ce4dd3de38cd7c29bf5b9d8a8efb55c08ec9be47robertphillips const SkPicture* getPicture() { 4128ddc26b68c4e41199c06961da3bff2ce72afff14commit-bot@chromium.org return fPicture; 4138ddc26b68c4e41199c06961da3bff2ce72afff14commit-bot@chromium.org } 4142a65a238b0e688356aee09d08f3f8a317359b4d2mtklein 415b1aded8edd1d809cded20ff546c6e9218b43cda4krajcevski#if SK_SUPPORT_GPU 416b1aded8edd1d809cded20ff546c6e9218b43cda4krajcevski explicit PictureRenderer(const GrContext::Options &opts) 417b1aded8edd1d809cded20ff546c6e9218b43cda4krajcevski#else 41802dfb12501f49115445a0d702280bbc7406c6ad2keyar@chromium.org PictureRenderer() 419b1aded8edd1d809cded20ff546c6e9218b43cda4krajcevski#endif 42084b18c7e3e042bf206e1ace3d1b6ea5bb929fe51robertphillips@google.com : fJsonSummaryPtr(NULL) 4210612564bb76ec533d26d87e03368fd81ef97831ekeyar@chromium.org , fDeviceType(kBitmap_DeviceType) 4228991c67f0c1b9364bb12dfb0f32a53bd5a3357f3commit-bot@chromium.org , fEnableWrites(false) 42350ff9bd4d72c77c7c5ec2393f28ddbd8050129dbjunov@chromium.org , fBBoxHierarchyType(kNone_BBoxHierarchyType) 42406d6ac645d9269ea05f7461533c646fd3ea71628scroggo@google.com , fScaleFactor(SK_Scalar1) 4250612564bb76ec533d26d87e03368fd81ef97831ekeyar@chromium.org#if SK_SUPPORT_GPU 426b1aded8edd1d809cded20ff546c6e9218b43cda4krajcevski , fGrContextFactory(opts) 4270556ea0ede7066b9b3ed9f03f5a6eb72cd718897scroggo@google.com , fGrContext(NULL) 428f6a90332ae21414cf19630764d4371ffd24ac0ccjvanverth@google.com , fSampleCount(0) 4290612564bb76ec533d26d87e03368fd81ef97831ekeyar@chromium.org#endif 430e3e940cf81dc46d872002ded98c1bd39c2daf1b0caryclark@google.com { 4317ae918eec73865ad0c0c138680e9d2df9fc5ea82robertphillips@google.com fGridInfo.fMargin.setEmpty(); 4327ae918eec73865ad0c0c138680e9d2df9fc5ea82robertphillips@google.com fGridInfo.fOffset.setZero(); 4337ae918eec73865ad0c0c138680e9d2df9fc5ea82robertphillips@google.com fGridInfo.fTileInterval.set(1, 1); 434e3e940cf81dc46d872002ded98c1bd39c2daf1b0caryclark@google.com sk_bzero(fDrawFilters, sizeof(fDrawFilters)); 435c0d5e549ab8d594a5da8db417db39622e9491fffscroggo@google.com fViewport.set(0, 0); 436e3e940cf81dc46d872002ded98c1bd39c2daf1b0caryclark@google.com } 4370612564bb76ec533d26d87e03368fd81ef97831ekeyar@chromium.org 4380556ea0ede7066b9b3ed9f03f5a6eb72cd718897scroggo@google.com#if SK_SUPPORT_GPU 4390556ea0ede7066b9b3ed9f03f5a6eb72cd718897scroggo@google.com virtual ~PictureRenderer() { 4400556ea0ede7066b9b3ed9f03f5a6eb72cd718897scroggo@google.com SkSafeUnref(fGrContext); 4410556ea0ede7066b9b3ed9f03f5a6eb72cd718897scroggo@google.com } 4420556ea0ede7066b9b3ed9f03f5a6eb72cd718897scroggo@google.com#endif 4430556ea0ede7066b9b3ed9f03f5a6eb72cd718897scroggo@google.com 4449d696c0d04548520af08252e577d2ca88012a239keyar@chromium.orgprotected: 4459d696c0d04548520af08252e577d2ca88012a239keyar@chromium.org SkAutoTUnref<SkCanvas> fCanvas; 446ce4dd3de38cd7c29bf5b9d8a8efb55c08ec9be47robertphillips SkAutoTUnref<const SkPicture> fPicture; 447f5e315ccf1ae2941f7cf53fa53e5c8c4bb665fe1commit-bot@chromium.org bool fUseChecksumBasedFilenames; 448205ce48c38c55ec7527d26042b5cea689369be8bcommit-bot@chromium.org ImageResultsAndExpectations* fJsonSummaryPtr; 449c0d5e549ab8d594a5da8db417db39622e9491fffscroggo@google.com SkDeviceTypes fDeviceType; 4508991c67f0c1b9364bb12dfb0f32a53bd5a3357f3commit-bot@chromium.org bool fEnableWrites; 451c0d5e549ab8d594a5da8db417db39622e9491fffscroggo@google.com BBoxHierarchyType fBBoxHierarchyType; 452c0d5e549ab8d594a5da8db417db39622e9491fffscroggo@google.com DrawFilterFlags fDrawFilters[SkDrawFilter::kTypeCount]; 453c0d5e549ab8d594a5da8db417db39622e9491fffscroggo@google.com SkString fDrawFiltersConfig; 4543f0451772109959fcb79bacf2c9a03e0eb39ff27commit-bot@chromium.org SkString fWritePath; 4553f0451772109959fcb79bacf2c9a03e0eb39ff27commit-bot@chromium.org SkString fMismatchPath; 456f5e315ccf1ae2941f7cf53fa53e5c8c4bb665fe1commit-bot@chromium.org SkString fInputFilename; 4575fb2ce38b3dcb8e60e9e112df23c9d42456d7069commit-bot@chromium.org SkTileGridFactory::TileGridInfo fGridInfo; // used when fBBoxHierarchyType is TileGrid 4580612564bb76ec533d26d87e03368fd81ef97831ekeyar@chromium.org 459c0d5e549ab8d594a5da8db417db39622e9491fffscroggo@google.com void buildBBoxHierarchy(); 460c0d5e549ab8d594a5da8db417db39622e9491fffscroggo@google.com 461c0d5e549ab8d594a5da8db417db39622e9491fffscroggo@google.com /** 462c0d5e549ab8d594a5da8db417db39622e9491fffscroggo@google.com * Return the total width that should be drawn. If the viewport width has been set greater than 463c0d5e549ab8d594a5da8db417db39622e9491fffscroggo@google.com * 0, this will be the minimum of the current SkPicture's width and the viewport's width. 464c0d5e549ab8d594a5da8db417db39622e9491fffscroggo@google.com */ 465c0d5e549ab8d594a5da8db417db39622e9491fffscroggo@google.com int getViewWidth(); 466c0d5e549ab8d594a5da8db417db39622e9491fffscroggo@google.com 467c0d5e549ab8d594a5da8db417db39622e9491fffscroggo@google.com /** 468c0d5e549ab8d594a5da8db417db39622e9491fffscroggo@google.com * Return the total height that should be drawn. If the viewport height has been set greater 469c0d5e549ab8d594a5da8db417db39622e9491fffscroggo@google.com * than 0, this will be the minimum of the current SkPicture's height and the viewport's height. 470c0d5e549ab8d594a5da8db417db39622e9491fffscroggo@google.com */ 471c0d5e549ab8d594a5da8db417db39622e9491fffscroggo@google.com int getViewHeight(); 472c0d5e549ab8d594a5da8db417db39622e9491fffscroggo@google.com 47382ec0b00f380906c1cdeb4b4cc4a355264ab3882scroggo@google.com /** 47482ec0b00f380906c1cdeb4b4cc4a355264ab3882scroggo@google.com * Scales the provided canvas to the scale factor set by setScaleFactor. 47582ec0b00f380906c1cdeb4b4cc4a355264ab3882scroggo@google.com */ 47682ec0b00f380906c1cdeb4b4cc4a355264ab3882scroggo@google.com void scaleToScaleFactor(SkCanvas*); 47782ec0b00f380906c1cdeb4b4cc4a355264ab3882scroggo@google.com 4785fb2ce38b3dcb8e60e9e112df23c9d42456d7069commit-bot@chromium.org SkBBHFactory* getFactory(); 4799f1c241e0d8a756fca1ec2dacb565eec83166d5frobertphillips uint32_t recordFlags() const { return 0; } 480c0d5e549ab8d594a5da8db417db39622e9491fffscroggo@google.com SkCanvas* setupCanvas(); 481c0d5e549ab8d594a5da8db417db39622e9491fffscroggo@google.com virtual SkCanvas* setupCanvas(int width, int height); 482c0d5e549ab8d594a5da8db417db39622e9491fffscroggo@google.com 483f5e315ccf1ae2941f7cf53fa53e5c8c4bb665fe1commit-bot@chromium.org /** 484f5e315ccf1ae2941f7cf53fa53e5c8c4bb665fe1commit-bot@chromium.org * Copy src to dest; if src==NULL, set dest to empty string. 485f5e315ccf1ae2941f7cf53fa53e5c8c4bb665fe1commit-bot@chromium.org */ 486f5e315ccf1ae2941f7cf53fa53e5c8c4bb665fe1commit-bot@chromium.org static void CopyString(SkString* dest, const SkString* src); 487f5e315ccf1ae2941f7cf53fa53e5c8c4bb665fe1commit-bot@chromium.org 4889d696c0d04548520af08252e577d2ca88012a239keyar@chromium.orgprivate: 489c0d5e549ab8d594a5da8db417db39622e9491fffscroggo@google.com SkISize fViewport; 49082ec0b00f380906c1cdeb4b4cc4a355264ab3882scroggo@google.com SkScalar fScaleFactor; 4910556ea0ede7066b9b3ed9f03f5a6eb72cd718897scroggo@google.com#if SK_SUPPORT_GPU 4920556ea0ede7066b9b3ed9f03f5a6eb72cd718897scroggo@google.com GrContextFactory fGrContextFactory; 4930556ea0ede7066b9b3ed9f03f5a6eb72cd718897scroggo@google.com GrContext* fGrContext; 494f6a90332ae21414cf19630764d4371ffd24ac0ccjvanverth@google.com int fSampleCount; 4950556ea0ede7066b9b3ed9f03f5a6eb72cd718897scroggo@google.com#endif 496c0d5e549ab8d594a5da8db417db39622e9491fffscroggo@google.com 4970a049b861e18c9c1ede865b8acbcbedc3dd10b43scroggo@google.com virtual SkString getConfigNameInternal() = 0; 4980a049b861e18c9c1ede865b8acbcbedc3dd10b43scroggo@google.com 4999d696c0d04548520af08252e577d2ca88012a239keyar@chromium.org typedef SkRefCnt INHERITED; 500451bb9f801d668275394ca5bd57f238e13cf3d17keyar@chromium.org}; 501451bb9f801d668275394ca5bd57f238e13cf3d17keyar@chromium.org 5029a4125283ad56cea3b986337cb669dde14bf0ed8scroggo@google.com/** 5039a4125283ad56cea3b986337cb669dde14bf0ed8scroggo@google.com * This class does not do any rendering, but its render function executes recording, which we want 5049a4125283ad56cea3b986337cb669dde14bf0ed8scroggo@google.com * to time. 5059a4125283ad56cea3b986337cb669dde14bf0ed8scroggo@google.com */ 5069a4125283ad56cea3b986337cb669dde14bf0ed8scroggo@google.comclass RecordPictureRenderer : public PictureRenderer { 507b1aded8edd1d809cded20ff546c6e9218b43cda4krajcevskipublic: 508b1aded8edd1d809cded20ff546c6e9218b43cda4krajcevski#if SK_SUPPORT_GPU 509b1aded8edd1d809cded20ff546c6e9218b43cda4krajcevski RecordPictureRenderer(const GrContext::Options &opts) : INHERITED(opts) { } 510b1aded8edd1d809cded20ff546c6e9218b43cda4krajcevski#endif 511b1aded8edd1d809cded20ff546c6e9218b43cda4krajcevski 512f5e315ccf1ae2941f7cf53fa53e5c8c4bb665fe1commit-bot@chromium.org virtual bool render(SkBitmap** out = NULL) SK_OVERRIDE; 5139a4125283ad56cea3b986337cb669dde14bf0ed8scroggo@google.com 5149a4125283ad56cea3b986337cb669dde14bf0ed8scroggo@google.com virtual SkString getPerIterTimeFormat() SK_OVERRIDE { return SkString("%.4f"); } 5159a4125283ad56cea3b986337cb669dde14bf0ed8scroggo@google.com 5169a4125283ad56cea3b986337cb669dde14bf0ed8scroggo@google.com virtual SkString getNormalTimeFormat() SK_OVERRIDE { return SkString("%6.4f"); } 5170a049b861e18c9c1ede865b8acbcbedc3dd10b43scroggo@google.com 518fd9720cfec6bc50fa77d40ffdf2f6cb4b5150d4edjsollen@google.comprotected: 519fd9720cfec6bc50fa77d40ffdf2f6cb4b5150d4edjsollen@google.com virtual SkCanvas* setupCanvas(int width, int height) SK_OVERRIDE; 520fd9720cfec6bc50fa77d40ffdf2f6cb4b5150d4edjsollen@google.com 5210a049b861e18c9c1ede865b8acbcbedc3dd10b43scroggo@google.comprivate: 5220a049b861e18c9c1ede865b8acbcbedc3dd10b43scroggo@google.com virtual SkString getConfigNameInternal() SK_OVERRIDE; 523b1aded8edd1d809cded20ff546c6e9218b43cda4krajcevski 524b1aded8edd1d809cded20ff546c6e9218b43cda4krajcevski typedef PictureRenderer INHERITED; 5259a4125283ad56cea3b986337cb669dde14bf0ed8scroggo@google.com}; 5269a4125283ad56cea3b986337cb669dde14bf0ed8scroggo@google.com 527451bb9f801d668275394ca5bd57f238e13cf3d17keyar@chromium.orgclass PipePictureRenderer : public PictureRenderer { 528163b56734fe01c088581895a8e0b65ddf1cb4fa5keyar@chromium.orgpublic: 529b1aded8edd1d809cded20ff546c6e9218b43cda4krajcevski#if SK_SUPPORT_GPU 530b1aded8edd1d809cded20ff546c6e9218b43cda4krajcevski PipePictureRenderer(const GrContext::Options &opts) : INHERITED(opts) { } 531b1aded8edd1d809cded20ff546c6e9218b43cda4krajcevski#endif 532b1aded8edd1d809cded20ff546c6e9218b43cda4krajcevski 533f5e315ccf1ae2941f7cf53fa53e5c8c4bb665fe1commit-bot@chromium.org virtual bool render(SkBitmap** out = NULL) SK_OVERRIDE; 5349d696c0d04548520af08252e577d2ca88012a239keyar@chromium.org 5359d696c0d04548520af08252e577d2ca88012a239keyar@chromium.orgprivate: 5360a049b861e18c9c1ede865b8acbcbedc3dd10b43scroggo@google.com virtual SkString getConfigNameInternal() SK_OVERRIDE; 5370a049b861e18c9c1ede865b8acbcbedc3dd10b43scroggo@google.com 5389d696c0d04548520af08252e577d2ca88012a239keyar@chromium.org typedef PictureRenderer INHERITED; 539451bb9f801d668275394ca5bd57f238e13cf3d17keyar@chromium.org}; 540451bb9f801d668275394ca5bd57f238e13cf3d17keyar@chromium.org 541451bb9f801d668275394ca5bd57f238e13cf3d17keyar@chromium.orgclass SimplePictureRenderer : public PictureRenderer { 542163b56734fe01c088581895a8e0b65ddf1cb4fa5keyar@chromium.orgpublic: 543b1aded8edd1d809cded20ff546c6e9218b43cda4krajcevski#if SK_SUPPORT_GPU 544b1aded8edd1d809cded20ff546c6e9218b43cda4krajcevski SimplePictureRenderer(const GrContext::Options &opts) : INHERITED(opts) { } 545b1aded8edd1d809cded20ff546c6e9218b43cda4krajcevski#endif 546b1aded8edd1d809cded20ff546c6e9218b43cda4krajcevski 547ce4dd3de38cd7c29bf5b9d8a8efb55c08ec9be47robertphillips virtual void init(const SkPicture* pict, 5482a65a238b0e688356aee09d08f3f8a317359b4d2mtklein const SkString* writePath, 549ce4dd3de38cd7c29bf5b9d8a8efb55c08ec9be47robertphillips const SkString* mismatchPath, 5502a65a238b0e688356aee09d08f3f8a317359b4d2mtklein const SkString* inputFilename, 551ce4dd3de38cd7c29bf5b9d8a8efb55c08ec9be47robertphillips bool useChecksumBasedFilenames) SK_OVERRIDE; 5529313ca4bde606a18f29214eea8b8e47312b8fd9cjunov@chromium.org 553f5e315ccf1ae2941f7cf53fa53e5c8c4bb665fe1commit-bot@chromium.org virtual bool render(SkBitmap** out = NULL) SK_OVERRIDE; 5549d696c0d04548520af08252e577d2ca88012a239keyar@chromium.org 5559d696c0d04548520af08252e577d2ca88012a239keyar@chromium.orgprivate: 5560a049b861e18c9c1ede865b8acbcbedc3dd10b43scroggo@google.com virtual SkString getConfigNameInternal() SK_OVERRIDE; 5570a049b861e18c9c1ede865b8acbcbedc3dd10b43scroggo@google.com 5589d696c0d04548520af08252e577d2ca88012a239keyar@chromium.org typedef PictureRenderer INHERITED; 559451bb9f801d668275394ca5bd57f238e13cf3d17keyar@chromium.org}; 560451bb9f801d668275394ca5bd57f238e13cf3d17keyar@chromium.org 561451bb9f801d668275394ca5bd57f238e13cf3d17keyar@chromium.orgclass TiledPictureRenderer : public PictureRenderer { 562451bb9f801d668275394ca5bd57f238e13cf3d17keyar@chromium.orgpublic: 563b1aded8edd1d809cded20ff546c6e9218b43cda4krajcevski#if SK_SUPPORT_GPU 564b1aded8edd1d809cded20ff546c6e9218b43cda4krajcevski TiledPictureRenderer(const GrContext::Options &opts); 565b1aded8edd1d809cded20ff546c6e9218b43cda4krajcevski#else 566451bb9f801d668275394ca5bd57f238e13cf3d17keyar@chromium.org TiledPictureRenderer(); 567b1aded8edd1d809cded20ff546c6e9218b43cda4krajcevski#endif 568451bb9f801d668275394ca5bd57f238e13cf3d17keyar@chromium.org 5692a65a238b0e688356aee09d08f3f8a317359b4d2mtklein virtual void init(const SkPicture* pict, 5702a65a238b0e688356aee09d08f3f8a317359b4d2mtklein const SkString* writePath, 571ce4dd3de38cd7c29bf5b9d8a8efb55c08ec9be47robertphillips const SkString* mismatchPath, 5722a65a238b0e688356aee09d08f3f8a317359b4d2mtklein const SkString* inputFilename, 573ce4dd3de38cd7c29bf5b9d8a8efb55c08ec9be47robertphillips bool useChecksumBasedFilenames) SK_OVERRIDE; 57481f9d2e05be4902993345dac93337158345c660bscroggo@google.com 57581f9d2e05be4902993345dac93337158345c660bscroggo@google.com /** 576f5e315ccf1ae2941f7cf53fa53e5c8c4bb665fe1commit-bot@chromium.org * Renders to tiles, rather than a single canvas. 5773f0451772109959fcb79bacf2c9a03e0eb39ff27commit-bot@chromium.org * If fWritePath was provided, a separate file is 57881f9d2e05be4902993345dac93337158345c660bscroggo@google.com * created for each tile, named "path0.png", "path1.png", etc. 57981f9d2e05be4902993345dac93337158345c660bscroggo@google.com */ 580f5e315ccf1ae2941f7cf53fa53e5c8c4bb665fe1commit-bot@chromium.org virtual bool render(SkBitmap** out = NULL) SK_OVERRIDE; 58181f9d2e05be4902993345dac93337158345c660bscroggo@google.com 5829d696c0d04548520af08252e577d2ca88012a239keyar@chromium.org virtual void end() SK_OVERRIDE; 583451bb9f801d668275394ca5bd57f238e13cf3d17keyar@chromium.org 584cc6e5efe03bfeda903d67d2bacd9ed0be58572bakeyar@chromium.org void setTileWidth(int width) { 585cc6e5efe03bfeda903d67d2bacd9ed0be58572bakeyar@chromium.org fTileWidth = width; 586cc6e5efe03bfeda903d67d2bacd9ed0be58572bakeyar@chromium.org } 587cc6e5efe03bfeda903d67d2bacd9ed0be58572bakeyar@chromium.org 588cc6e5efe03bfeda903d67d2bacd9ed0be58572bakeyar@chromium.org int getTileWidth() const { 589cc6e5efe03bfeda903d67d2bacd9ed0be58572bakeyar@chromium.org return fTileWidth; 590cc6e5efe03bfeda903d67d2bacd9ed0be58572bakeyar@chromium.org } 591cc6e5efe03bfeda903d67d2bacd9ed0be58572bakeyar@chromium.org 592cc6e5efe03bfeda903d67d2bacd9ed0be58572bakeyar@chromium.org void setTileHeight(int height) { 593cc6e5efe03bfeda903d67d2bacd9ed0be58572bakeyar@chromium.org fTileHeight = height; 594cc6e5efe03bfeda903d67d2bacd9ed0be58572bakeyar@chromium.org } 595cc6e5efe03bfeda903d67d2bacd9ed0be58572bakeyar@chromium.org 596cc6e5efe03bfeda903d67d2bacd9ed0be58572bakeyar@chromium.org int getTileHeight() const { 597cc6e5efe03bfeda903d67d2bacd9ed0be58572bakeyar@chromium.org return fTileHeight; 598cc6e5efe03bfeda903d67d2bacd9ed0be58572bakeyar@chromium.org } 599cc6e5efe03bfeda903d67d2bacd9ed0be58572bakeyar@chromium.org 600cc6e5efe03bfeda903d67d2bacd9ed0be58572bakeyar@chromium.org void setTileWidthPercentage(double percentage) { 601cc6e5efe03bfeda903d67d2bacd9ed0be58572bakeyar@chromium.org fTileWidthPercentage = percentage; 602cc6e5efe03bfeda903d67d2bacd9ed0be58572bakeyar@chromium.org } 603cc6e5efe03bfeda903d67d2bacd9ed0be58572bakeyar@chromium.org 604163b56734fe01c088581895a8e0b65ddf1cb4fa5keyar@chromium.org double getTileWidthPercentage() const { 605cc6e5efe03bfeda903d67d2bacd9ed0be58572bakeyar@chromium.org return fTileWidthPercentage; 606cc6e5efe03bfeda903d67d2bacd9ed0be58572bakeyar@chromium.org } 607cc6e5efe03bfeda903d67d2bacd9ed0be58572bakeyar@chromium.org 608cc6e5efe03bfeda903d67d2bacd9ed0be58572bakeyar@chromium.org void setTileHeightPercentage(double percentage) { 609cc6e5efe03bfeda903d67d2bacd9ed0be58572bakeyar@chromium.org fTileHeightPercentage = percentage; 610cc6e5efe03bfeda903d67d2bacd9ed0be58572bakeyar@chromium.org } 611cc6e5efe03bfeda903d67d2bacd9ed0be58572bakeyar@chromium.org 612163b56734fe01c088581895a8e0b65ddf1cb4fa5keyar@chromium.org double getTileHeightPercentage() const { 613cc6e5efe03bfeda903d67d2bacd9ed0be58572bakeyar@chromium.org return fTileHeightPercentage; 614cc6e5efe03bfeda903d67d2bacd9ed0be58572bakeyar@chromium.org } 615cc6e5efe03bfeda903d67d2bacd9ed0be58572bakeyar@chromium.org 616f4959ab11827bef99e8985031feb457cae1f987akeyar@chromium.org void setTileMinPowerOf2Width(int width) { 617f4959ab11827bef99e8985031feb457cae1f987akeyar@chromium.org SkASSERT(SkIsPow2(width) && width > 0); 618f4959ab11827bef99e8985031feb457cae1f987akeyar@chromium.org if (!SkIsPow2(width) || width <= 0) { 619f4959ab11827bef99e8985031feb457cae1f987akeyar@chromium.org return; 620f4959ab11827bef99e8985031feb457cae1f987akeyar@chromium.org } 621f4959ab11827bef99e8985031feb457cae1f987akeyar@chromium.org 622f4959ab11827bef99e8985031feb457cae1f987akeyar@chromium.org fTileMinPowerOf2Width = width; 623f4959ab11827bef99e8985031feb457cae1f987akeyar@chromium.org } 624f4959ab11827bef99e8985031feb457cae1f987akeyar@chromium.org 625f4959ab11827bef99e8985031feb457cae1f987akeyar@chromium.org int getTileMinPowerOf2Width() const { 626f4959ab11827bef99e8985031feb457cae1f987akeyar@chromium.org return fTileMinPowerOf2Width; 627f4959ab11827bef99e8985031feb457cae1f987akeyar@chromium.org } 628f4959ab11827bef99e8985031feb457cae1f987akeyar@chromium.org 629cbcef708914f3b5e9bb63ad3d87261378026e29bscroggo@google.com virtual TiledPictureRenderer* getTiledRenderer() SK_OVERRIDE { return this; } 630cbcef708914f3b5e9bb63ad3d87261378026e29bscroggo@google.com 631161e1ba4c0a82e21c7d68808529699fd2394ad6cscroggo@google.com virtual bool supportsTimingIndividualTiles() { return true; } 632161e1ba4c0a82e21c7d68808529699fd2394ad6cscroggo@google.com 633cbcef708914f3b5e9bb63ad3d87261378026e29bscroggo@google.com /** 634cbcef708914f3b5e9bb63ad3d87261378026e29bscroggo@google.com * Report the number of tiles in the x and y directions. Must not be called before init. 635cbcef708914f3b5e9bb63ad3d87261378026e29bscroggo@google.com * @param x Output parameter identifying the number of tiles in the x direction. 636cbcef708914f3b5e9bb63ad3d87261378026e29bscroggo@google.com * @param y Output parameter identifying the number of tiles in the y direction. 637cbcef708914f3b5e9bb63ad3d87261378026e29bscroggo@google.com * @return True if the tiles have been set up, and x and y are meaningful. If false, x and y are 638cbcef708914f3b5e9bb63ad3d87261378026e29bscroggo@google.com * unmodified. 639cbcef708914f3b5e9bb63ad3d87261378026e29bscroggo@google.com */ 640cbcef708914f3b5e9bb63ad3d87261378026e29bscroggo@google.com bool tileDimensions(int& x, int&y); 641cbcef708914f3b5e9bb63ad3d87261378026e29bscroggo@google.com 642cbcef708914f3b5e9bb63ad3d87261378026e29bscroggo@google.com /** 643cbcef708914f3b5e9bb63ad3d87261378026e29bscroggo@google.com * Move to the next tile and return its indices. Must be called before calling drawCurrentTile 644cbcef708914f3b5e9bb63ad3d87261378026e29bscroggo@google.com * for the first time. 645cbcef708914f3b5e9bb63ad3d87261378026e29bscroggo@google.com * @param i Output parameter identifying the column of the next tile to be drawn on the next 646cbcef708914f3b5e9bb63ad3d87261378026e29bscroggo@google.com * call to drawNextTile. 647cbcef708914f3b5e9bb63ad3d87261378026e29bscroggo@google.com * @param j Output parameter identifying the row of the next tile to be drawn on the next call 648cbcef708914f3b5e9bb63ad3d87261378026e29bscroggo@google.com * to drawNextTile. 649cbcef708914f3b5e9bb63ad3d87261378026e29bscroggo@google.com * @param True if the tiles have been created and the next tile to be drawn by drawCurrentTile 650cbcef708914f3b5e9bb63ad3d87261378026e29bscroggo@google.com * is within the range of tiles. If false, i and j are unmodified. 651cbcef708914f3b5e9bb63ad3d87261378026e29bscroggo@google.com */ 652cbcef708914f3b5e9bb63ad3d87261378026e29bscroggo@google.com bool nextTile(int& i, int& j); 653cbcef708914f3b5e9bb63ad3d87261378026e29bscroggo@google.com 654cbcef708914f3b5e9bb63ad3d87261378026e29bscroggo@google.com /** 655cbcef708914f3b5e9bb63ad3d87261378026e29bscroggo@google.com * Render one tile. This will draw the same tile each time it is called until nextTile is 656cbcef708914f3b5e9bb63ad3d87261378026e29bscroggo@google.com * called. The tile rendered will depend on how many calls have been made to nextTile. 657cbcef708914f3b5e9bb63ad3d87261378026e29bscroggo@google.com * It is an error to call this without first calling nextTile, or if nextTile returns false. 658cbcef708914f3b5e9bb63ad3d87261378026e29bscroggo@google.com */ 659cbcef708914f3b5e9bb63ad3d87261378026e29bscroggo@google.com void drawCurrentTile(); 660cbcef708914f3b5e9bb63ad3d87261378026e29bscroggo@google.com 661a62da2fee72172a630c2d1dba0e529b357743662scroggo@google.comprotected: 662a62da2fee72172a630c2d1dba0e529b357743662scroggo@google.com SkTDArray<SkRect> fTileRects; 663451bb9f801d668275394ca5bd57f238e13cf3d17keyar@chromium.org 6640a049b861e18c9c1ede865b8acbcbedc3dd10b43scroggo@google.com virtual SkCanvas* setupCanvas(int width, int height) SK_OVERRIDE; 6650a049b861e18c9c1ede865b8acbcbedc3dd10b43scroggo@google.com virtual SkString getConfigNameInternal() SK_OVERRIDE; 6660a049b861e18c9c1ede865b8acbcbedc3dd10b43scroggo@google.com 667451bb9f801d668275394ca5bd57f238e13cf3d17keyar@chromium.orgprivate: 668cbcef708914f3b5e9bb63ad3d87261378026e29bscroggo@google.com int fTileWidth; 669cbcef708914f3b5e9bb63ad3d87261378026e29bscroggo@google.com int fTileHeight; 670cbcef708914f3b5e9bb63ad3d87261378026e29bscroggo@google.com double fTileWidthPercentage; 671cbcef708914f3b5e9bb63ad3d87261378026e29bscroggo@google.com double fTileHeightPercentage; 672cbcef708914f3b5e9bb63ad3d87261378026e29bscroggo@google.com int fTileMinPowerOf2Width; 673cbcef708914f3b5e9bb63ad3d87261378026e29bscroggo@google.com 674cbcef708914f3b5e9bb63ad3d87261378026e29bscroggo@google.com // These variables are only used for timing individual tiles. 675cbcef708914f3b5e9bb63ad3d87261378026e29bscroggo@google.com // Next tile to draw in fTileRects. 676cbcef708914f3b5e9bb63ad3d87261378026e29bscroggo@google.com int fCurrentTileOffset; 677cbcef708914f3b5e9bb63ad3d87261378026e29bscroggo@google.com // Number of tiles in the x direction. 678cbcef708914f3b5e9bb63ad3d87261378026e29bscroggo@google.com int fTilesX; 679cbcef708914f3b5e9bb63ad3d87261378026e29bscroggo@google.com // Number of tiles in the y direction. 680cbcef708914f3b5e9bb63ad3d87261378026e29bscroggo@google.com int fTilesY; 681bcdf2ec50dfd170959cc2db67c49f6dac084be03scroggo@google.com 6829d696c0d04548520af08252e577d2ca88012a239keyar@chromium.org void setupTiles(); 683f4959ab11827bef99e8985031feb457cae1f987akeyar@chromium.org void setupPowerOf2Tiles(); 6849d696c0d04548520af08252e577d2ca88012a239keyar@chromium.org 6859d696c0d04548520af08252e577d2ca88012a239keyar@chromium.org typedef PictureRenderer INHERITED; 686451bb9f801d668275394ca5bd57f238e13cf3d17keyar@chromium.org}; 687451bb9f801d668275394ca5bd57f238e13cf3d17keyar@chromium.org 6889a4125283ad56cea3b986337cb669dde14bf0ed8scroggo@google.com/** 6899a4125283ad56cea3b986337cb669dde14bf0ed8scroggo@google.com * This class does not do any rendering, but its render function executes turning an SkPictureRecord 6909a4125283ad56cea3b986337cb669dde14bf0ed8scroggo@google.com * into an SkPicturePlayback, which we want to time. 6919a4125283ad56cea3b986337cb669dde14bf0ed8scroggo@google.com */ 6929a4125283ad56cea3b986337cb669dde14bf0ed8scroggo@google.comclass PlaybackCreationRenderer : public PictureRenderer { 6939a4125283ad56cea3b986337cb669dde14bf0ed8scroggo@google.compublic: 694b1aded8edd1d809cded20ff546c6e9218b43cda4krajcevski#if SK_SUPPORT_GPU 695b1aded8edd1d809cded20ff546c6e9218b43cda4krajcevski PlaybackCreationRenderer(const GrContext::Options &opts) : INHERITED(opts) { } 696b1aded8edd1d809cded20ff546c6e9218b43cda4krajcevski#endif 697b1aded8edd1d809cded20ff546c6e9218b43cda4krajcevski 6989a4125283ad56cea3b986337cb669dde14bf0ed8scroggo@google.com virtual void setup() SK_OVERRIDE; 6999a4125283ad56cea3b986337cb669dde14bf0ed8scroggo@google.com 700f5e315ccf1ae2941f7cf53fa53e5c8c4bb665fe1commit-bot@chromium.org virtual bool render(SkBitmap** out = NULL) SK_OVERRIDE; 7019a4125283ad56cea3b986337cb669dde14bf0ed8scroggo@google.com 7029a4125283ad56cea3b986337cb669dde14bf0ed8scroggo@google.com virtual SkString getPerIterTimeFormat() SK_OVERRIDE { return SkString("%.4f"); } 7039a4125283ad56cea3b986337cb669dde14bf0ed8scroggo@google.com 7049a4125283ad56cea3b986337cb669dde14bf0ed8scroggo@google.com virtual SkString getNormalTimeFormat() SK_OVERRIDE { return SkString("%6.4f"); } 7059a4125283ad56cea3b986337cb669dde14bf0ed8scroggo@google.com 7069a4125283ad56cea3b986337cb669dde14bf0ed8scroggo@google.comprivate: 70784b18c7e3e042bf206e1ace3d1b6ea5bb929fe51robertphillips@google.com SkAutoTDelete<SkPictureRecorder> fRecorder; 7080a049b861e18c9c1ede865b8acbcbedc3dd10b43scroggo@google.com 7090a049b861e18c9c1ede865b8acbcbedc3dd10b43scroggo@google.com virtual SkString getConfigNameInternal() SK_OVERRIDE; 7100a049b861e18c9c1ede865b8acbcbedc3dd10b43scroggo@google.com 7119a4125283ad56cea3b986337cb669dde14bf0ed8scroggo@google.com typedef PictureRenderer INHERITED; 7129a4125283ad56cea3b986337cb669dde14bf0ed8scroggo@google.com}; 7139a4125283ad56cea3b986337cb669dde14bf0ed8scroggo@google.com 714b1aded8edd1d809cded20ff546c6e9218b43cda4krajcevski#if SK_SUPPORT_GPU 715b1aded8edd1d809cded20ff546c6e9218b43cda4krajcevskiextern PictureRenderer* CreateGatherPixelRefsRenderer(const GrContext::Options& opts); 716b1aded8edd1d809cded20ff546c6e9218b43cda4krajcevski#else 717fe7b1ed30a75cecfe80d1ba4d1f60295e99aeef0reed@google.comextern PictureRenderer* CreateGatherPixelRefsRenderer(); 718b1aded8edd1d809cded20ff546c6e9218b43cda4krajcevski#endif 719fe7b1ed30a75cecfe80d1ba4d1f60295e99aeef0reed@google.com 720451bb9f801d668275394ca5bd57f238e13cf3d17keyar@chromium.org} 721451bb9f801d668275394ca5bd57f238e13cf3d17keyar@chromium.org 722451bb9f801d668275394ca5bd57f238e13cf3d17keyar@chromium.org#endif // PictureRenderer_DEFINED 723