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