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"
12a62da2fee72172a630c2d1dba0e529b357743662scroggo@google.com#include "SkCountdown.h"
13a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com#include "SkDrawFilter.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"
20a62da2fee72172a630c2d1dba0e529b357743662scroggo@google.com#include "SkRunnable.h"
219a4125283ad56cea3b986337cb669dde14bf0ed8scroggo@google.com#include "SkString.h"
22a62da2fee72172a630c2d1dba0e529b357743662scroggo@google.com#include "SkTDArray.h"
23a62da2fee72172a630c2d1dba0e529b357743662scroggo@google.com#include "SkThreadPool.h"
24a62da2fee72172a630c2d1dba0e529b357743662scroggo@google.com#include "SkTypes.h"
25451bb9f801d668275394ca5bd57f238e13cf3d17keyar@chromium.org
260612564bb76ec533d26d87e03368fd81ef97831ekeyar@chromium.org#if SK_SUPPORT_GPU
270612564bb76ec533d26d87e03368fd81ef97831ekeyar@chromium.org#include "GrContextFactory.h"
280612564bb76ec533d26d87e03368fd81ef97831ekeyar@chromium.org#include "GrContext.h"
290612564bb76ec533d26d87e03368fd81ef97831ekeyar@chromium.org#endif
300612564bb76ec533d26d87e03368fd81ef97831ekeyar@chromium.org
3190c0fbd34947b6b644e90c5b2253752035f65b64commit-bot@chromium.org#include "image_expectations.h"
3290c0fbd34947b6b644e90c5b2253752035f65b64commit-bot@chromium.org
33451bb9f801d668275394ca5bd57f238e13cf3d17keyar@chromium.orgclass SkBitmap;
34451bb9f801d668275394ca5bd57f238e13cf3d17keyar@chromium.orgclass SkCanvas;
356177e6999d23a4268ffd98dedfb1da00e272a89brobertphillips@google.comclass SkGLContextHelper;
36a62da2fee72172a630c2d1dba0e529b357743662scroggo@google.comclass SkThread;
37451bb9f801d668275394ca5bd57f238e13cf3d17keyar@chromium.org
38451bb9f801d668275394ca5bd57f238e13cf3d17keyar@chromium.orgnamespace sk_tools {
39451bb9f801d668275394ca5bd57f238e13cf3d17keyar@chromium.org
40cbcef708914f3b5e9bb63ad3d87261378026e29bscroggo@google.comclass TiledPictureRenderer;
41cbcef708914f3b5e9bb63ad3d87261378026e29bscroggo@google.com
42451bb9f801d668275394ca5bd57f238e13cf3d17keyar@chromium.orgclass PictureRenderer : public SkRefCnt {
43cbcef708914f3b5e9bb63ad3d87261378026e29bscroggo@google.com
44451bb9f801d668275394ca5bd57f238e13cf3d17keyar@chromium.orgpublic:
45c81686cd6edba2cfedcfd5ad6a164f160ddfb49fkeyar@chromium.org    enum SkDeviceTypes {
460556ea0ede7066b9b3ed9f03f5a6eb72cd718897scroggo@google.com#if SK_ANGLE
470556ea0ede7066b9b3ed9f03f5a6eb72cd718897scroggo@google.com        kAngle_DeviceType,
480556ea0ede7066b9b3ed9f03f5a6eb72cd718897scroggo@google.com#endif
496ab96733b85cebac99b378f998cd7dc10b286395rmistry@google.com#if SK_MESA
506ab96733b85cebac99b378f998cd7dc10b286395rmistry@google.com        kMesa_DeviceType,
516ab96733b85cebac99b378f998cd7dc10b286395rmistry@google.com#endif
52c81686cd6edba2cfedcfd5ad6a164f160ddfb49fkeyar@chromium.org        kBitmap_DeviceType,
53c81686cd6edba2cfedcfd5ad6a164f160ddfb49fkeyar@chromium.org#if SK_SUPPORT_GPU
540556ea0ede7066b9b3ed9f03f5a6eb72cd718897scroggo@google.com        kGPU_DeviceType,
550fd5270ad69f5b99852d544158c989d2deda2c11commit-bot@chromium.org        kNVPR_DeviceType,
56c81686cd6edba2cfedcfd5ad6a164f160ddfb49fkeyar@chromium.org#endif
57c81686cd6edba2cfedcfd5ad6a164f160ddfb49fkeyar@chromium.org    };
58c81686cd6edba2cfedcfd5ad6a164f160ddfb49fkeyar@chromium.org
599313ca4bde606a18f29214eea8b8e47312b8fd9cjunov@chromium.org    enum BBoxHierarchyType {
609313ca4bde606a18f29214eea8b8e47312b8fd9cjunov@chromium.org        kNone_BBoxHierarchyType = 0,
61c22d1398089fdb95480fb3459b23e4931e4f5280commit-bot@chromium.org        kQuadTree_BBoxHierarchyType,
629313ca4bde606a18f29214eea8b8e47312b8fd9cjunov@chromium.org        kRTree_BBoxHierarchyType,
637b53706a7d596a2d8dce6cfe5b543264e5a37239junov@chromium.org        kTileGrid_BBoxHierarchyType,
64cdd0f92b1aca0c2164ac1a24d7f14a6ad3cc10f5commit-bot@chromium.org
65cdd0f92b1aca0c2164ac1a24d7f14a6ad3cc10f5commit-bot@chromium.org        kLast_BBoxHierarchyType = kTileGrid_BBoxHierarchyType,
669313ca4bde606a18f29214eea8b8e47312b8fd9cjunov@chromium.org    };
679313ca4bde606a18f29214eea8b8e47312b8fd9cjunov@chromium.org
68a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com    // this uses SkPaint::Flags as a base and adds additional flags
69a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com    enum DrawFilterFlags {
70a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com        kNone_DrawFilterFlag = 0,
71881b10b023bcba3c81f1d9e98e62b7b6855b0f11reed@google.com        kHinting_DrawFilterFlag = 0x10000, // toggles between no hinting and normal hinting
72881b10b023bcba3c81f1d9e98e62b7b6855b0f11reed@google.com        kSlightHinting_DrawFilterFlag = 0x20000, // toggles between slight and normal hinting
73881b10b023bcba3c81f1d9e98e62b7b6855b0f11reed@google.com        kAAClip_DrawFilterFlag = 0x40000, // toggles between soft and hard clip
74387db0a2e516ca01508f7d16433f84da2ea3b93bhumper@google.com        kMaskFilter_DrawFilterFlag = 0x80000, // toggles on/off mask filters (e.g., blurs)
75a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com    };
76a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com
77491493119c11206c5823b76eb6420a705be243a1robertphillips@google.com    SK_COMPILE_ASSERT(!(kMaskFilter_DrawFilterFlag & SkPaint::kAllFlags), maskfilter_flag_must_be_greater);
78a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com    SK_COMPILE_ASSERT(!(kHinting_DrawFilterFlag & SkPaint::kAllFlags),
79a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com            hinting_flag_must_be_greater);
80a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com    SK_COMPILE_ASSERT(!(kSlightHinting_DrawFilterFlag & SkPaint::kAllFlags),
81a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com            slight_hinting_flag_must_be_greater);
82a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com
83a62da2fee72172a630c2d1dba0e529b357743662scroggo@google.com    /**
84a62da2fee72172a630c2d1dba0e529b357743662scroggo@google.com     * Called with each new SkPicture to render.
85f5e315ccf1ae2941f7cf53fa53e5c8c4bb665fe1commit-bot@chromium.org     *
86f5e315ccf1ae2941f7cf53fa53e5c8c4bb665fe1commit-bot@chromium.org     * @param pict The SkPicture to render.
873f0451772109959fcb79bacf2c9a03e0eb39ff27commit-bot@chromium.org     * @param writePath The output directory within which this renderer should write all images,
883f0451772109959fcb79bacf2c9a03e0eb39ff27commit-bot@chromium.org     *     or NULL if this renderer should not write all images.
893f0451772109959fcb79bacf2c9a03e0eb39ff27commit-bot@chromium.org     * @param mismatchPath The output directory within which this renderer should write any images
903f0451772109959fcb79bacf2c9a03e0eb39ff27commit-bot@chromium.org     *     which do not match expectations, or NULL if this renderer should not write mismatches.
91f5e315ccf1ae2941f7cf53fa53e5c8c4bb665fe1commit-bot@chromium.org     * @param inputFilename The name of the input file we are rendering.
92f5e315ccf1ae2941f7cf53fa53e5c8c4bb665fe1commit-bot@chromium.org     * @param useChecksumBasedFilenames Whether to use checksum-based filenames when writing
93f5e315ccf1ae2941f7cf53fa53e5c8c4bb665fe1commit-bot@chromium.org     *     bitmap images to disk.
94a62da2fee72172a630c2d1dba0e529b357743662scroggo@google.com     */
953f0451772109959fcb79bacf2c9a03e0eb39ff27commit-bot@chromium.org    virtual void init(SkPicture* pict, const SkString* writePath, const SkString* mismatchPath,
96f5e315ccf1ae2941f7cf53fa53e5c8c4bb665fe1commit-bot@chromium.org                      const SkString* inputFilename, 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     */
1680556ea0ede7066b9b3ed9f03f5a6eb72cd718897scroggo@google.com    bool setDeviceType(SkDeviceTypes deviceType) {
169c81686cd6edba2cfedcfd5ad6a164f160ddfb49fkeyar@chromium.org        fDeviceType = deviceType;
1700556ea0ede7066b9b3ed9f03f5a6eb72cd718897scroggo@google.com#if SK_SUPPORT_GPU
1710556ea0ede7066b9b3ed9f03f5a6eb72cd718897scroggo@google.com        // In case this function is called more than once
1720556ea0ede7066b9b3ed9f03f5a6eb72cd718897scroggo@google.com        SkSafeUnref(fGrContext);
1730556ea0ede7066b9b3ed9f03f5a6eb72cd718897scroggo@google.com        fGrContext = NULL;
1740556ea0ede7066b9b3ed9f03f5a6eb72cd718897scroggo@google.com        // Set to Native so it will have an initial value.
1750556ea0ede7066b9b3ed9f03f5a6eb72cd718897scroggo@google.com        GrContextFactory::GLContextType glContextType = GrContextFactory::kNative_GLContextType;
1760556ea0ede7066b9b3ed9f03f5a6eb72cd718897scroggo@google.com#endif
1770556ea0ede7066b9b3ed9f03f5a6eb72cd718897scroggo@google.com        switch(deviceType) {
1780556ea0ede7066b9b3ed9f03f5a6eb72cd718897scroggo@google.com            case kBitmap_DeviceType:
1790556ea0ede7066b9b3ed9f03f5a6eb72cd718897scroggo@google.com                return true;
1800556ea0ede7066b9b3ed9f03f5a6eb72cd718897scroggo@google.com#if SK_SUPPORT_GPU
1810556ea0ede7066b9b3ed9f03f5a6eb72cd718897scroggo@google.com            case kGPU_DeviceType:
1820556ea0ede7066b9b3ed9f03f5a6eb72cd718897scroggo@google.com                // Already set to GrContextFactory::kNative_GLContextType, above.
1830556ea0ede7066b9b3ed9f03f5a6eb72cd718897scroggo@google.com                break;
1840fd5270ad69f5b99852d544158c989d2deda2c11commit-bot@chromium.org            case kNVPR_DeviceType:
1850fd5270ad69f5b99852d544158c989d2deda2c11commit-bot@chromium.org                glContextType = GrContextFactory::kNVPR_GLContextType;
1860fd5270ad69f5b99852d544158c989d2deda2c11commit-bot@chromium.org                break;
1870556ea0ede7066b9b3ed9f03f5a6eb72cd718897scroggo@google.com#if SK_ANGLE
1880556ea0ede7066b9b3ed9f03f5a6eb72cd718897scroggo@google.com            case kAngle_DeviceType:
1890556ea0ede7066b9b3ed9f03f5a6eb72cd718897scroggo@google.com                glContextType = GrContextFactory::kANGLE_GLContextType;
1900556ea0ede7066b9b3ed9f03f5a6eb72cd718897scroggo@google.com                break;
1910556ea0ede7066b9b3ed9f03f5a6eb72cd718897scroggo@google.com#endif
1926ab96733b85cebac99b378f998cd7dc10b286395rmistry@google.com#if SK_MESA
1936ab96733b85cebac99b378f998cd7dc10b286395rmistry@google.com            case kMesa_DeviceType:
1946ab96733b85cebac99b378f998cd7dc10b286395rmistry@google.com                glContextType = GrContextFactory::kMESA_GLContextType;
1956ab96733b85cebac99b378f998cd7dc10b286395rmistry@google.com                break;
1966ab96733b85cebac99b378f998cd7dc10b286395rmistry@google.com#endif
1970556ea0ede7066b9b3ed9f03f5a6eb72cd718897scroggo@google.com#endif
1980556ea0ede7066b9b3ed9f03f5a6eb72cd718897scroggo@google.com            default:
1990556ea0ede7066b9b3ed9f03f5a6eb72cd718897scroggo@google.com                // Invalid device type.
2000556ea0ede7066b9b3ed9f03f5a6eb72cd718897scroggo@google.com                return false;
2010556ea0ede7066b9b3ed9f03f5a6eb72cd718897scroggo@google.com        }
2020556ea0ede7066b9b3ed9f03f5a6eb72cd718897scroggo@google.com#if SK_SUPPORT_GPU
2030556ea0ede7066b9b3ed9f03f5a6eb72cd718897scroggo@google.com        fGrContext = fGrContextFactory.get(glContextType);
2040556ea0ede7066b9b3ed9f03f5a6eb72cd718897scroggo@google.com        if (NULL == fGrContext) {
2050556ea0ede7066b9b3ed9f03f5a6eb72cd718897scroggo@google.com            return false;
2060556ea0ede7066b9b3ed9f03f5a6eb72cd718897scroggo@google.com        } else {
2070556ea0ede7066b9b3ed9f03f5a6eb72cd718897scroggo@google.com            fGrContext->ref();
2080556ea0ede7066b9b3ed9f03f5a6eb72cd718897scroggo@google.com            return true;
2090556ea0ede7066b9b3ed9f03f5a6eb72cd718897scroggo@google.com        }
2100556ea0ede7066b9b3ed9f03f5a6eb72cd718897scroggo@google.com#endif
211fe6391a624f98b1c70581ac86d5733afe11872d3keyar@chromium.org    }
212fe6391a624f98b1c70581ac86d5733afe11872d3keyar@chromium.org
213f6a90332ae21414cf19630764d4371ffd24ac0ccjvanverth@google.com#if SK_SUPPORT_GPU
214f6a90332ae21414cf19630764d4371ffd24ac0ccjvanverth@google.com    void setSampleCount(int sampleCount) {
215f6a90332ae21414cf19630764d4371ffd24ac0ccjvanverth@google.com        fSampleCount = sampleCount;
216f6a90332ae21414cf19630764d4371ffd24ac0ccjvanverth@google.com    }
217f6a90332ae21414cf19630764d4371ffd24ac0ccjvanverth@google.com#endif
218f6a90332ae21414cf19630764d4371ffd24ac0ccjvanverth@google.com
219e3e940cf81dc46d872002ded98c1bd39c2daf1b0caryclark@google.com    void setDrawFilters(DrawFilterFlags const * const filters, const SkString& configName) {
220e3e940cf81dc46d872002ded98c1bd39c2daf1b0caryclark@google.com        memcpy(fDrawFilters, filters, sizeof(fDrawFilters));
221a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com        fDrawFiltersConfig = configName;
222a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com    }
223a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com
2249313ca4bde606a18f29214eea8b8e47312b8fd9cjunov@chromium.org    void setBBoxHierarchyType(BBoxHierarchyType bbhType) {
2259313ca4bde606a18f29214eea8b8e47312b8fd9cjunov@chromium.org        fBBoxHierarchyType = bbhType;
2269313ca4bde606a18f29214eea8b8e47312b8fd9cjunov@chromium.org    }
2279313ca4bde606a18f29214eea8b8e47312b8fd9cjunov@chromium.org
228e286e84a6a23f8a4c81708c1a19c9561f355c720junov@chromium.org    BBoxHierarchyType getBBoxHierarchyType() { return fBBoxHierarchyType; }
229e286e84a6a23f8a4c81708c1a19c9561f355c720junov@chromium.org
2307b53706a7d596a2d8dce6cfe5b543264e5a37239junov@chromium.org    void setGridSize(int width, int height) {
23129b19e53cfac5af4f9bd5d361436d1097f349a34junov@chromium.org        fGridInfo.fTileInterval.set(width, height);
2327b53706a7d596a2d8dce6cfe5b543264e5a37239junov@chromium.org    }
2337b53706a7d596a2d8dce6cfe5b543264e5a37239junov@chromium.org
234205ce48c38c55ec7527d26042b5cea689369be8bcommit-bot@chromium.org    void setJsonSummaryPtr(ImageResultsAndExpectations* jsonSummaryPtr) {
235a3f882c4756bd8b9b6449dcc60b6d884ee0cc8edcommit-bot@chromium.org        fJsonSummaryPtr = jsonSummaryPtr;
236a3f882c4756bd8b9b6449dcc60b6d884ee0cc8edcommit-bot@chromium.org    }
237a3f882c4756bd8b9b6449dcc60b6d884ee0cc8edcommit-bot@chromium.org
238fe6391a624f98b1c70581ac86d5733afe11872d3keyar@chromium.org    bool isUsingBitmapDevice() {
23978a35c5f1dcc00b2b442069a94f9e7c996f8d7f9keyar@chromium.org        return kBitmap_DeviceType == fDeviceType;
2404ea96c5e5449248780acfeb3cef4ec812f955d74keyar@chromium.org    }
2414ea96c5e5449248780acfeb3cef4ec812f955d74keyar@chromium.org
2429a4125283ad56cea3b986337cb669dde14bf0ed8scroggo@google.com    virtual SkString getPerIterTimeFormat() { return SkString("%.2f"); }
2439a4125283ad56cea3b986337cb669dde14bf0ed8scroggo@google.com
2449a4125283ad56cea3b986337cb669dde14bf0ed8scroggo@google.com    virtual SkString getNormalTimeFormat() { return SkString("%6.2f"); }
2459a4125283ad56cea3b986337cb669dde14bf0ed8scroggo@google.com
2460a049b861e18c9c1ede865b8acbcbedc3dd10b43scroggo@google.com    /**
2470a049b861e18c9c1ede865b8acbcbedc3dd10b43scroggo@google.com     * Reports the configuration of this PictureRenderer.
2480a049b861e18c9c1ede865b8acbcbedc3dd10b43scroggo@google.com     */
2490a049b861e18c9c1ede865b8acbcbedc3dd10b43scroggo@google.com    SkString getConfigName() {
2500a049b861e18c9c1ede865b8acbcbedc3dd10b43scroggo@google.com        SkString config = this->getConfigNameInternal();
251c4013c199cae88684846b0f798c4d80fbcf19d63scroggo@google.com        if (!fViewport.isEmpty()) {
252c4013c199cae88684846b0f798c4d80fbcf19d63scroggo@google.com            config.appendf("_viewport_%ix%i", fViewport.width(), fViewport.height());
253c4013c199cae88684846b0f798c4d80fbcf19d63scroggo@google.com        }
2549de35eb37513836ddef147fd48fb1aacf60a7e51commit-bot@chromium.org        if (fScaleFactor != SK_Scalar1) {
2559de35eb37513836ddef147fd48fb1aacf60a7e51commit-bot@chromium.org            config.appendf("_scalar_%f", SkScalarToFloat(fScaleFactor));
2569de35eb37513836ddef147fd48fb1aacf60a7e51commit-bot@chromium.org        }
2570a049b861e18c9c1ede865b8acbcbedc3dd10b43scroggo@google.com        if (kRTree_BBoxHierarchyType == fBBoxHierarchyType) {
2580a049b861e18c9c1ede865b8acbcbedc3dd10b43scroggo@google.com            config.append("_rtree");
259c22d1398089fdb95480fb3459b23e4931e4f5280commit-bot@chromium.org        } else if (kQuadTree_BBoxHierarchyType == fBBoxHierarchyType) {
260c22d1398089fdb95480fb3459b23e4931e4f5280commit-bot@chromium.org            config.append("_quadtree");
2617b53706a7d596a2d8dce6cfe5b543264e5a37239junov@chromium.org        } else if (kTileGrid_BBoxHierarchyType == fBBoxHierarchyType) {
2627b53706a7d596a2d8dce6cfe5b543264e5a37239junov@chromium.org            config.append("_grid");
26306fdc6937df52942226a0a5e7bba169c27006ef1kelvinly            config.append("_");
26406fdc6937df52942226a0a5e7bba169c27006ef1kelvinly            config.appendS32(fGridInfo.fTileInterval.width());
26506fdc6937df52942226a0a5e7bba169c27006ef1kelvinly            config.append("x");
26606fdc6937df52942226a0a5e7bba169c27006ef1kelvinly            config.appendS32(fGridInfo.fTileInterval.height());
2670a049b861e18c9c1ede865b8acbcbedc3dd10b43scroggo@google.com        }
2680a049b861e18c9c1ede865b8acbcbedc3dd10b43scroggo@google.com#if SK_SUPPORT_GPU
269e8fe4bc3efa8f18f5651c5d005fba1935a741be0robertphillips@google.com        switch (fDeviceType) {
2700556ea0ede7066b9b3ed9f03f5a6eb72cd718897scroggo@google.com            case kGPU_DeviceType:
271f6a90332ae21414cf19630764d4371ffd24ac0ccjvanverth@google.com                if (fSampleCount) {
272f6a90332ae21414cf19630764d4371ffd24ac0ccjvanverth@google.com                    config.appendf("_msaa%d", fSampleCount);
273f6a90332ae21414cf19630764d4371ffd24ac0ccjvanverth@google.com                } else {
274f6a90332ae21414cf19630764d4371ffd24ac0ccjvanverth@google.com                    config.append("_gpu");
275f6a90332ae21414cf19630764d4371ffd24ac0ccjvanverth@google.com                }
2760556ea0ede7066b9b3ed9f03f5a6eb72cd718897scroggo@google.com                break;
2770fd5270ad69f5b99852d544158c989d2deda2c11commit-bot@chromium.org            case kNVPR_DeviceType:
2780fd5270ad69f5b99852d544158c989d2deda2c11commit-bot@chromium.org                config.appendf("_nvprmsaa%d", fSampleCount);
2790fd5270ad69f5b99852d544158c989d2deda2c11commit-bot@chromium.org                break;
2800556ea0ede7066b9b3ed9f03f5a6eb72cd718897scroggo@google.com#if SK_ANGLE
2810556ea0ede7066b9b3ed9f03f5a6eb72cd718897scroggo@google.com            case kAngle_DeviceType:
2820556ea0ede7066b9b3ed9f03f5a6eb72cd718897scroggo@google.com                config.append("_angle");
2830556ea0ede7066b9b3ed9f03f5a6eb72cd718897scroggo@google.com                break;
2840556ea0ede7066b9b3ed9f03f5a6eb72cd718897scroggo@google.com#endif
2856ab96733b85cebac99b378f998cd7dc10b286395rmistry@google.com#if SK_MESA
2866ab96733b85cebac99b378f998cd7dc10b286395rmistry@google.com            case kMesa_DeviceType:
2876ab96733b85cebac99b378f998cd7dc10b286395rmistry@google.com                config.append("_mesa");
2886ab96733b85cebac99b378f998cd7dc10b286395rmistry@google.com                break;
2896ab96733b85cebac99b378f998cd7dc10b286395rmistry@google.com#endif
2900556ea0ede7066b9b3ed9f03f5a6eb72cd718897scroggo@google.com            default:
2910556ea0ede7066b9b3ed9f03f5a6eb72cd718897scroggo@google.com                // Assume that no extra info means bitmap.
2920556ea0ede7066b9b3ed9f03f5a6eb72cd718897scroggo@google.com                break;
2930556ea0ede7066b9b3ed9f03f5a6eb72cd718897scroggo@google.com        }
294e8fe4bc3efa8f18f5651c5d005fba1935a741be0robertphillips@google.com#endif
295a36223764466c964ed1035bf6f152ba55168f61ecaryclark@google.com        config.append(fDrawFiltersConfig.c_str());
2960a049b861e18c9c1ede865b8acbcbedc3dd10b43scroggo@google.com        return config;
2970a049b861e18c9c1ede865b8acbcbedc3dd10b43scroggo@google.com    }
2980a049b861e18c9c1ede865b8acbcbedc3dd10b43scroggo@google.com
2994ea96c5e5449248780acfeb3cef4ec812f955d74keyar@chromium.org#if SK_SUPPORT_GPU
300fe6391a624f98b1c70581ac86d5733afe11872d3keyar@chromium.org    bool isUsingGpuDevice() {
3010556ea0ede7066b9b3ed9f03f5a6eb72cd718897scroggo@google.com        switch (fDeviceType) {
3020556ea0ede7066b9b3ed9f03f5a6eb72cd718897scroggo@google.com            case kGPU_DeviceType:
3030fd5270ad69f5b99852d544158c989d2deda2c11commit-bot@chromium.org            case kNVPR_DeviceType:
3040556ea0ede7066b9b3ed9f03f5a6eb72cd718897scroggo@google.com                // fall through
3050556ea0ede7066b9b3ed9f03f5a6eb72cd718897scroggo@google.com#if SK_ANGLE
3060556ea0ede7066b9b3ed9f03f5a6eb72cd718897scroggo@google.com            case kAngle_DeviceType:
3076ab96733b85cebac99b378f998cd7dc10b286395rmistry@google.com                // fall through
3086ab96733b85cebac99b378f998cd7dc10b286395rmistry@google.com#endif
3096ab96733b85cebac99b378f998cd7dc10b286395rmistry@google.com#if SK_MESA
3106ab96733b85cebac99b378f998cd7dc10b286395rmistry@google.com            case kMesa_DeviceType:
3110556ea0ede7066b9b3ed9f03f5a6eb72cd718897scroggo@google.com#endif
3120556ea0ede7066b9b3ed9f03f5a6eb72cd718897scroggo@google.com                return true;
3130556ea0ede7066b9b3ed9f03f5a6eb72cd718897scroggo@google.com            default:
3140556ea0ede7066b9b3ed9f03f5a6eb72cd718897scroggo@google.com                return false;
3150556ea0ede7066b9b3ed9f03f5a6eb72cd718897scroggo@google.com        }
316fe6391a624f98b1c70581ac86d5733afe11872d3keyar@chromium.org    }
31777a5522d0e4437ef2b856acd7b135b6afda64ceekeyar@chromium.org
3186177e6999d23a4268ffd98dedfb1da00e272a89brobertphillips@google.com    SkGLContextHelper* getGLContext() {
3190556ea0ede7066b9b3ed9f03f5a6eb72cd718897scroggo@google.com        GrContextFactory::GLContextType glContextType
3200556ea0ede7066b9b3ed9f03f5a6eb72cd718897scroggo@google.com                = GrContextFactory::kNull_GLContextType;
3210556ea0ede7066b9b3ed9f03f5a6eb72cd718897scroggo@google.com        switch(fDeviceType) {
3220556ea0ede7066b9b3ed9f03f5a6eb72cd718897scroggo@google.com            case kGPU_DeviceType:
3230556ea0ede7066b9b3ed9f03f5a6eb72cd718897scroggo@google.com                glContextType = GrContextFactory::kNative_GLContextType;
3240556ea0ede7066b9b3ed9f03f5a6eb72cd718897scroggo@google.com                break;
3250fd5270ad69f5b99852d544158c989d2deda2c11commit-bot@chromium.org            case kNVPR_DeviceType:
3260fd5270ad69f5b99852d544158c989d2deda2c11commit-bot@chromium.org                glContextType = GrContextFactory::kNVPR_GLContextType;
3270fd5270ad69f5b99852d544158c989d2deda2c11commit-bot@chromium.org                break;
3280556ea0ede7066b9b3ed9f03f5a6eb72cd718897scroggo@google.com#if SK_ANGLE
3290556ea0ede7066b9b3ed9f03f5a6eb72cd718897scroggo@google.com            case kAngle_DeviceType:
3300556ea0ede7066b9b3ed9f03f5a6eb72cd718897scroggo@google.com                glContextType = GrContextFactory::kANGLE_GLContextType;
3310556ea0ede7066b9b3ed9f03f5a6eb72cd718897scroggo@google.com                break;
3320556ea0ede7066b9b3ed9f03f5a6eb72cd718897scroggo@google.com#endif
3336ab96733b85cebac99b378f998cd7dc10b286395rmistry@google.com#if SK_MESA
3346ab96733b85cebac99b378f998cd7dc10b286395rmistry@google.com            case kMesa_DeviceType:
3356ab96733b85cebac99b378f998cd7dc10b286395rmistry@google.com                glContextType = GrContextFactory::kMESA_GLContextType;
3366ab96733b85cebac99b378f998cd7dc10b286395rmistry@google.com                break;
3376ab96733b85cebac99b378f998cd7dc10b286395rmistry@google.com#endif
3380556ea0ede7066b9b3ed9f03f5a6eb72cd718897scroggo@google.com            default:
3390556ea0ede7066b9b3ed9f03f5a6eb72cd718897scroggo@google.com                return NULL;
34077a5522d0e4437ef2b856acd7b135b6afda64ceekeyar@chromium.org        }
3410556ea0ede7066b9b3ed9f03f5a6eb72cd718897scroggo@google.com        return fGrContextFactory.getGLContext(glContextType);
34277a5522d0e4437ef2b856acd7b135b6afda64ceekeyar@chromium.org    }
343163c84ba5026907fea7b4f4bdcf8b16c13103adcrobertphillips@google.com
344163c84ba5026907fea7b4f4bdcf8b16c13103adcrobertphillips@google.com    GrContext* getGrContext() {
345163c84ba5026907fea7b4f4bdcf8b16c13103adcrobertphillips@google.com        return fGrContext;
346163c84ba5026907fea7b4f4bdcf8b16c13103adcrobertphillips@google.com    }
3474ea96c5e5449248780acfeb3cef4ec812f955d74keyar@chromium.org#endif
3484ea96c5e5449248780acfeb3cef4ec812f955d74keyar@chromium.org
349145d1c0fdcef63991d7f910cc067a653a8aa2c4ccommit-bot@chromium.org    SkCanvas* getCanvas() {
350145d1c0fdcef63991d7f910cc067a653a8aa2c4ccommit-bot@chromium.org        return fCanvas;
351145d1c0fdcef63991d7f910cc067a653a8aa2c4ccommit-bot@chromium.org    }
352145d1c0fdcef63991d7f910cc067a653a8aa2c4ccommit-bot@chromium.org
3538ddc26b68c4e41199c06961da3bff2ce72afff14commit-bot@chromium.org    SkPicture* getPicture() {
3548ddc26b68c4e41199c06961da3bff2ce72afff14commit-bot@chromium.org        return fPicture;
3558ddc26b68c4e41199c06961da3bff2ce72afff14commit-bot@chromium.org    }
3568ddc26b68c4e41199c06961da3bff2ce72afff14commit-bot@chromium.org
35702dfb12501f49115445a0d702280bbc7406c6ad2keyar@chromium.org    PictureRenderer()
35884b18c7e3e042bf206e1ace3d1b6ea5bb929fe51robertphillips@google.com        : fJsonSummaryPtr(NULL)
3590612564bb76ec533d26d87e03368fd81ef97831ekeyar@chromium.org        , fDeviceType(kBitmap_DeviceType)
3608991c67f0c1b9364bb12dfb0f32a53bd5a3357f3commit-bot@chromium.org        , fEnableWrites(false)
36150ff9bd4d72c77c7c5ec2393f28ddbd8050129dbjunov@chromium.org        , fBBoxHierarchyType(kNone_BBoxHierarchyType)
36206d6ac645d9269ea05f7461533c646fd3ea71628scroggo@google.com        , fScaleFactor(SK_Scalar1)
3630612564bb76ec533d26d87e03368fd81ef97831ekeyar@chromium.org#if SK_SUPPORT_GPU
3640556ea0ede7066b9b3ed9f03f5a6eb72cd718897scroggo@google.com        , fGrContext(NULL)
365f6a90332ae21414cf19630764d4371ffd24ac0ccjvanverth@google.com        , fSampleCount(0)
3660612564bb76ec533d26d87e03368fd81ef97831ekeyar@chromium.org#endif
367e3e940cf81dc46d872002ded98c1bd39c2daf1b0caryclark@google.com        {
3687ae918eec73865ad0c0c138680e9d2df9fc5ea82robertphillips@google.com            fGridInfo.fMargin.setEmpty();
3697ae918eec73865ad0c0c138680e9d2df9fc5ea82robertphillips@google.com            fGridInfo.fOffset.setZero();
3707ae918eec73865ad0c0c138680e9d2df9fc5ea82robertphillips@google.com            fGridInfo.fTileInterval.set(1, 1);
371e3e940cf81dc46d872002ded98c1bd39c2daf1b0caryclark@google.com            sk_bzero(fDrawFilters, sizeof(fDrawFilters));
372c0d5e549ab8d594a5da8db417db39622e9491fffscroggo@google.com            fViewport.set(0, 0);
373e3e940cf81dc46d872002ded98c1bd39c2daf1b0caryclark@google.com        }
3740612564bb76ec533d26d87e03368fd81ef97831ekeyar@chromium.org
3750556ea0ede7066b9b3ed9f03f5a6eb72cd718897scroggo@google.com#if SK_SUPPORT_GPU
3760556ea0ede7066b9b3ed9f03f5a6eb72cd718897scroggo@google.com    virtual ~PictureRenderer() {
3770556ea0ede7066b9b3ed9f03f5a6eb72cd718897scroggo@google.com        SkSafeUnref(fGrContext);
3780556ea0ede7066b9b3ed9f03f5a6eb72cd718897scroggo@google.com    }
3790556ea0ede7066b9b3ed9f03f5a6eb72cd718897scroggo@google.com#endif
3800556ea0ede7066b9b3ed9f03f5a6eb72cd718897scroggo@google.com
3819d696c0d04548520af08252e577d2ca88012a239keyar@chromium.orgprotected:
3829d696c0d04548520af08252e577d2ca88012a239keyar@chromium.org    SkAutoTUnref<SkCanvas> fCanvas;
38384b18c7e3e042bf206e1ace3d1b6ea5bb929fe51robertphillips@google.com    SkAutoTUnref<SkPicture> fPicture;
384f5e315ccf1ae2941f7cf53fa53e5c8c4bb665fe1commit-bot@chromium.org    bool                   fUseChecksumBasedFilenames;
385205ce48c38c55ec7527d26042b5cea689369be8bcommit-bot@chromium.org    ImageResultsAndExpectations*   fJsonSummaryPtr;
386c0d5e549ab8d594a5da8db417db39622e9491fffscroggo@google.com    SkDeviceTypes          fDeviceType;
3878991c67f0c1b9364bb12dfb0f32a53bd5a3357f3commit-bot@chromium.org    bool                   fEnableWrites;
388c0d5e549ab8d594a5da8db417db39622e9491fffscroggo@google.com    BBoxHierarchyType      fBBoxHierarchyType;
389c0d5e549ab8d594a5da8db417db39622e9491fffscroggo@google.com    DrawFilterFlags        fDrawFilters[SkDrawFilter::kTypeCount];
390c0d5e549ab8d594a5da8db417db39622e9491fffscroggo@google.com    SkString               fDrawFiltersConfig;
3913f0451772109959fcb79bacf2c9a03e0eb39ff27commit-bot@chromium.org    SkString               fWritePath;
3923f0451772109959fcb79bacf2c9a03e0eb39ff27commit-bot@chromium.org    SkString               fMismatchPath;
393f5e315ccf1ae2941f7cf53fa53e5c8c4bb665fe1commit-bot@chromium.org    SkString               fInputFilename;
3945fb2ce38b3dcb8e60e9e112df23c9d42456d7069commit-bot@chromium.org    SkTileGridFactory::TileGridInfo fGridInfo; // used when fBBoxHierarchyType is TileGrid
3950612564bb76ec533d26d87e03368fd81ef97831ekeyar@chromium.org
396c0d5e549ab8d594a5da8db417db39622e9491fffscroggo@google.com    void buildBBoxHierarchy();
397c0d5e549ab8d594a5da8db417db39622e9491fffscroggo@google.com
398c0d5e549ab8d594a5da8db417db39622e9491fffscroggo@google.com    /**
399c0d5e549ab8d594a5da8db417db39622e9491fffscroggo@google.com     * Return the total width that should be drawn. If the viewport width has been set greater than
400c0d5e549ab8d594a5da8db417db39622e9491fffscroggo@google.com     * 0, this will be the minimum of the current SkPicture's width and the viewport's width.
401c0d5e549ab8d594a5da8db417db39622e9491fffscroggo@google.com     */
402c0d5e549ab8d594a5da8db417db39622e9491fffscroggo@google.com    int getViewWidth();
403c0d5e549ab8d594a5da8db417db39622e9491fffscroggo@google.com
404c0d5e549ab8d594a5da8db417db39622e9491fffscroggo@google.com    /**
405c0d5e549ab8d594a5da8db417db39622e9491fffscroggo@google.com     * Return the total height that should be drawn. If the viewport height has been set greater
406c0d5e549ab8d594a5da8db417db39622e9491fffscroggo@google.com     * than 0, this will be the minimum of the current SkPicture's height and the viewport's height.
407c0d5e549ab8d594a5da8db417db39622e9491fffscroggo@google.com     */
408c0d5e549ab8d594a5da8db417db39622e9491fffscroggo@google.com    int getViewHeight();
409c0d5e549ab8d594a5da8db417db39622e9491fffscroggo@google.com
41082ec0b00f380906c1cdeb4b4cc4a355264ab3882scroggo@google.com    /**
41182ec0b00f380906c1cdeb4b4cc4a355264ab3882scroggo@google.com     * Scales the provided canvas to the scale factor set by setScaleFactor.
41282ec0b00f380906c1cdeb4b4cc4a355264ab3882scroggo@google.com     */
41382ec0b00f380906c1cdeb4b4cc4a355264ab3882scroggo@google.com    void scaleToScaleFactor(SkCanvas*);
41482ec0b00f380906c1cdeb4b4cc4a355264ab3882scroggo@google.com
4155fb2ce38b3dcb8e60e9e112df23c9d42456d7069commit-bot@chromium.org    SkBBHFactory* getFactory();
4169f1c241e0d8a756fca1ec2dacb565eec83166d5frobertphillips    uint32_t recordFlags() const { return 0; }
417c0d5e549ab8d594a5da8db417db39622e9491fffscroggo@google.com    SkCanvas* setupCanvas();
418c0d5e549ab8d594a5da8db417db39622e9491fffscroggo@google.com    virtual SkCanvas* setupCanvas(int width, int height);
419c0d5e549ab8d594a5da8db417db39622e9491fffscroggo@google.com
420f5e315ccf1ae2941f7cf53fa53e5c8c4bb665fe1commit-bot@chromium.org    /**
421f5e315ccf1ae2941f7cf53fa53e5c8c4bb665fe1commit-bot@chromium.org     * Copy src to dest; if src==NULL, set dest to empty string.
422f5e315ccf1ae2941f7cf53fa53e5c8c4bb665fe1commit-bot@chromium.org     */
423f5e315ccf1ae2941f7cf53fa53e5c8c4bb665fe1commit-bot@chromium.org    static void CopyString(SkString* dest, const SkString* src);
424f5e315ccf1ae2941f7cf53fa53e5c8c4bb665fe1commit-bot@chromium.org
4259d696c0d04548520af08252e577d2ca88012a239keyar@chromium.orgprivate:
426c0d5e549ab8d594a5da8db417db39622e9491fffscroggo@google.com    SkISize                fViewport;
42782ec0b00f380906c1cdeb4b4cc4a355264ab3882scroggo@google.com    SkScalar               fScaleFactor;
4280556ea0ede7066b9b3ed9f03f5a6eb72cd718897scroggo@google.com#if SK_SUPPORT_GPU
4290556ea0ede7066b9b3ed9f03f5a6eb72cd718897scroggo@google.com    GrContextFactory       fGrContextFactory;
4300556ea0ede7066b9b3ed9f03f5a6eb72cd718897scroggo@google.com    GrContext*             fGrContext;
431f6a90332ae21414cf19630764d4371ffd24ac0ccjvanverth@google.com    int                    fSampleCount;
4320556ea0ede7066b9b3ed9f03f5a6eb72cd718897scroggo@google.com#endif
433c0d5e549ab8d594a5da8db417db39622e9491fffscroggo@google.com
4340a049b861e18c9c1ede865b8acbcbedc3dd10b43scroggo@google.com    virtual SkString getConfigNameInternal() = 0;
4350a049b861e18c9c1ede865b8acbcbedc3dd10b43scroggo@google.com
4369d696c0d04548520af08252e577d2ca88012a239keyar@chromium.org    typedef SkRefCnt INHERITED;
437451bb9f801d668275394ca5bd57f238e13cf3d17keyar@chromium.org};
438451bb9f801d668275394ca5bd57f238e13cf3d17keyar@chromium.org
4399a4125283ad56cea3b986337cb669dde14bf0ed8scroggo@google.com/**
4409a4125283ad56cea3b986337cb669dde14bf0ed8scroggo@google.com * This class does not do any rendering, but its render function executes recording, which we want
4419a4125283ad56cea3b986337cb669dde14bf0ed8scroggo@google.com * to time.
4429a4125283ad56cea3b986337cb669dde14bf0ed8scroggo@google.com */
4439a4125283ad56cea3b986337cb669dde14bf0ed8scroggo@google.comclass RecordPictureRenderer : public PictureRenderer {
444f5e315ccf1ae2941f7cf53fa53e5c8c4bb665fe1commit-bot@chromium.org    virtual bool render(SkBitmap** out = NULL) SK_OVERRIDE;
4459a4125283ad56cea3b986337cb669dde14bf0ed8scroggo@google.com
4469a4125283ad56cea3b986337cb669dde14bf0ed8scroggo@google.com    virtual SkString getPerIterTimeFormat() SK_OVERRIDE { return SkString("%.4f"); }
4479a4125283ad56cea3b986337cb669dde14bf0ed8scroggo@google.com
4489a4125283ad56cea3b986337cb669dde14bf0ed8scroggo@google.com    virtual SkString getNormalTimeFormat() SK_OVERRIDE { return SkString("%6.4f"); }
4490a049b861e18c9c1ede865b8acbcbedc3dd10b43scroggo@google.com
450fd9720cfec6bc50fa77d40ffdf2f6cb4b5150d4edjsollen@google.comprotected:
451fd9720cfec6bc50fa77d40ffdf2f6cb4b5150d4edjsollen@google.com    virtual SkCanvas* setupCanvas(int width, int height) SK_OVERRIDE;
452fd9720cfec6bc50fa77d40ffdf2f6cb4b5150d4edjsollen@google.com
4530a049b861e18c9c1ede865b8acbcbedc3dd10b43scroggo@google.comprivate:
4540a049b861e18c9c1ede865b8acbcbedc3dd10b43scroggo@google.com    virtual SkString getConfigNameInternal() SK_OVERRIDE;
4559a4125283ad56cea3b986337cb669dde14bf0ed8scroggo@google.com};
4569a4125283ad56cea3b986337cb669dde14bf0ed8scroggo@google.com
457451bb9f801d668275394ca5bd57f238e13cf3d17keyar@chromium.orgclass PipePictureRenderer : public PictureRenderer {
458163b56734fe01c088581895a8e0b65ddf1cb4fa5keyar@chromium.orgpublic:
459f5e315ccf1ae2941f7cf53fa53e5c8c4bb665fe1commit-bot@chromium.org    virtual bool render(SkBitmap** out = NULL) SK_OVERRIDE;
4609d696c0d04548520af08252e577d2ca88012a239keyar@chromium.org
4619d696c0d04548520af08252e577d2ca88012a239keyar@chromium.orgprivate:
4620a049b861e18c9c1ede865b8acbcbedc3dd10b43scroggo@google.com    virtual SkString getConfigNameInternal() SK_OVERRIDE;
4630a049b861e18c9c1ede865b8acbcbedc3dd10b43scroggo@google.com
4649d696c0d04548520af08252e577d2ca88012a239keyar@chromium.org    typedef PictureRenderer INHERITED;
465451bb9f801d668275394ca5bd57f238e13cf3d17keyar@chromium.org};
466451bb9f801d668275394ca5bd57f238e13cf3d17keyar@chromium.org
467451bb9f801d668275394ca5bd57f238e13cf3d17keyar@chromium.orgclass SimplePictureRenderer : public PictureRenderer {
468163b56734fe01c088581895a8e0b65ddf1cb4fa5keyar@chromium.orgpublic:
4693f0451772109959fcb79bacf2c9a03e0eb39ff27commit-bot@chromium.org    virtual void init(SkPicture* pict, const SkString* writePath, const SkString* mismatchPath,
470f5e315ccf1ae2941f7cf53fa53e5c8c4bb665fe1commit-bot@chromium.org                      const SkString* inputFilename, bool useChecksumBasedFilenames) SK_OVERRIDE;
4719313ca4bde606a18f29214eea8b8e47312b8fd9cjunov@chromium.org
472f5e315ccf1ae2941f7cf53fa53e5c8c4bb665fe1commit-bot@chromium.org    virtual bool render(SkBitmap** out = NULL) SK_OVERRIDE;
4739d696c0d04548520af08252e577d2ca88012a239keyar@chromium.org
4749d696c0d04548520af08252e577d2ca88012a239keyar@chromium.orgprivate:
4750a049b861e18c9c1ede865b8acbcbedc3dd10b43scroggo@google.com    virtual SkString getConfigNameInternal() SK_OVERRIDE;
4760a049b861e18c9c1ede865b8acbcbedc3dd10b43scroggo@google.com
4779d696c0d04548520af08252e577d2ca88012a239keyar@chromium.org    typedef PictureRenderer INHERITED;
478451bb9f801d668275394ca5bd57f238e13cf3d17keyar@chromium.org};
479451bb9f801d668275394ca5bd57f238e13cf3d17keyar@chromium.org
480451bb9f801d668275394ca5bd57f238e13cf3d17keyar@chromium.orgclass TiledPictureRenderer : public PictureRenderer {
481451bb9f801d668275394ca5bd57f238e13cf3d17keyar@chromium.orgpublic:
482451bb9f801d668275394ca5bd57f238e13cf3d17keyar@chromium.org    TiledPictureRenderer();
483451bb9f801d668275394ca5bd57f238e13cf3d17keyar@chromium.org
4843f0451772109959fcb79bacf2c9a03e0eb39ff27commit-bot@chromium.org    virtual void init(SkPicture* pict, const SkString* writePath, const SkString* mismatchPath,
485f5e315ccf1ae2941f7cf53fa53e5c8c4bb665fe1commit-bot@chromium.org                      const SkString* inputFilename, bool useChecksumBasedFilenames) SK_OVERRIDE;
48681f9d2e05be4902993345dac93337158345c660bscroggo@google.com
48781f9d2e05be4902993345dac93337158345c660bscroggo@google.com    /**
488f5e315ccf1ae2941f7cf53fa53e5c8c4bb665fe1commit-bot@chromium.org     * Renders to tiles, rather than a single canvas.
4893f0451772109959fcb79bacf2c9a03e0eb39ff27commit-bot@chromium.org     * If fWritePath was provided, a separate file is
49081f9d2e05be4902993345dac93337158345c660bscroggo@google.com     * created for each tile, named "path0.png", "path1.png", etc.
49181f9d2e05be4902993345dac93337158345c660bscroggo@google.com     * Multithreaded mode currently does not support writing to a file.
49281f9d2e05be4902993345dac93337158345c660bscroggo@google.com     */
493f5e315ccf1ae2941f7cf53fa53e5c8c4bb665fe1commit-bot@chromium.org    virtual bool render(SkBitmap** out = NULL) SK_OVERRIDE;
49481f9d2e05be4902993345dac93337158345c660bscroggo@google.com
4959d696c0d04548520af08252e577d2ca88012a239keyar@chromium.org    virtual void end() SK_OVERRIDE;
496451bb9f801d668275394ca5bd57f238e13cf3d17keyar@chromium.org
497cc6e5efe03bfeda903d67d2bacd9ed0be58572bakeyar@chromium.org    void setTileWidth(int width) {
498cc6e5efe03bfeda903d67d2bacd9ed0be58572bakeyar@chromium.org        fTileWidth = width;
499cc6e5efe03bfeda903d67d2bacd9ed0be58572bakeyar@chromium.org    }
500cc6e5efe03bfeda903d67d2bacd9ed0be58572bakeyar@chromium.org
501cc6e5efe03bfeda903d67d2bacd9ed0be58572bakeyar@chromium.org    int getTileWidth() const {
502cc6e5efe03bfeda903d67d2bacd9ed0be58572bakeyar@chromium.org        return fTileWidth;
503cc6e5efe03bfeda903d67d2bacd9ed0be58572bakeyar@chromium.org    }
504cc6e5efe03bfeda903d67d2bacd9ed0be58572bakeyar@chromium.org
505cc6e5efe03bfeda903d67d2bacd9ed0be58572bakeyar@chromium.org    void setTileHeight(int height) {
506cc6e5efe03bfeda903d67d2bacd9ed0be58572bakeyar@chromium.org        fTileHeight = height;
507cc6e5efe03bfeda903d67d2bacd9ed0be58572bakeyar@chromium.org    }
508cc6e5efe03bfeda903d67d2bacd9ed0be58572bakeyar@chromium.org
509cc6e5efe03bfeda903d67d2bacd9ed0be58572bakeyar@chromium.org    int getTileHeight() const {
510cc6e5efe03bfeda903d67d2bacd9ed0be58572bakeyar@chromium.org        return fTileHeight;
511cc6e5efe03bfeda903d67d2bacd9ed0be58572bakeyar@chromium.org    }
512cc6e5efe03bfeda903d67d2bacd9ed0be58572bakeyar@chromium.org
513cc6e5efe03bfeda903d67d2bacd9ed0be58572bakeyar@chromium.org    void setTileWidthPercentage(double percentage) {
514cc6e5efe03bfeda903d67d2bacd9ed0be58572bakeyar@chromium.org        fTileWidthPercentage = percentage;
515cc6e5efe03bfeda903d67d2bacd9ed0be58572bakeyar@chromium.org    }
516cc6e5efe03bfeda903d67d2bacd9ed0be58572bakeyar@chromium.org
517163b56734fe01c088581895a8e0b65ddf1cb4fa5keyar@chromium.org    double getTileWidthPercentage() const {
518cc6e5efe03bfeda903d67d2bacd9ed0be58572bakeyar@chromium.org        return fTileWidthPercentage;
519cc6e5efe03bfeda903d67d2bacd9ed0be58572bakeyar@chromium.org    }
520cc6e5efe03bfeda903d67d2bacd9ed0be58572bakeyar@chromium.org
521cc6e5efe03bfeda903d67d2bacd9ed0be58572bakeyar@chromium.org    void setTileHeightPercentage(double percentage) {
522cc6e5efe03bfeda903d67d2bacd9ed0be58572bakeyar@chromium.org        fTileHeightPercentage = percentage;
523cc6e5efe03bfeda903d67d2bacd9ed0be58572bakeyar@chromium.org    }
524cc6e5efe03bfeda903d67d2bacd9ed0be58572bakeyar@chromium.org
525163b56734fe01c088581895a8e0b65ddf1cb4fa5keyar@chromium.org    double getTileHeightPercentage() const {
526cc6e5efe03bfeda903d67d2bacd9ed0be58572bakeyar@chromium.org        return fTileHeightPercentage;
527cc6e5efe03bfeda903d67d2bacd9ed0be58572bakeyar@chromium.org    }
528cc6e5efe03bfeda903d67d2bacd9ed0be58572bakeyar@chromium.org
529f4959ab11827bef99e8985031feb457cae1f987akeyar@chromium.org    void setTileMinPowerOf2Width(int width) {
530f4959ab11827bef99e8985031feb457cae1f987akeyar@chromium.org        SkASSERT(SkIsPow2(width) && width > 0);
531f4959ab11827bef99e8985031feb457cae1f987akeyar@chromium.org        if (!SkIsPow2(width) || width <= 0) {
532f4959ab11827bef99e8985031feb457cae1f987akeyar@chromium.org            return;
533f4959ab11827bef99e8985031feb457cae1f987akeyar@chromium.org        }
534f4959ab11827bef99e8985031feb457cae1f987akeyar@chromium.org
535f4959ab11827bef99e8985031feb457cae1f987akeyar@chromium.org        fTileMinPowerOf2Width = width;
536f4959ab11827bef99e8985031feb457cae1f987akeyar@chromium.org    }
537f4959ab11827bef99e8985031feb457cae1f987akeyar@chromium.org
538f4959ab11827bef99e8985031feb457cae1f987akeyar@chromium.org    int getTileMinPowerOf2Width() const {
539f4959ab11827bef99e8985031feb457cae1f987akeyar@chromium.org        return fTileMinPowerOf2Width;
540f4959ab11827bef99e8985031feb457cae1f987akeyar@chromium.org    }
541f4959ab11827bef99e8985031feb457cae1f987akeyar@chromium.org
542cbcef708914f3b5e9bb63ad3d87261378026e29bscroggo@google.com    virtual TiledPictureRenderer* getTiledRenderer() SK_OVERRIDE { return this; }
543cbcef708914f3b5e9bb63ad3d87261378026e29bscroggo@google.com
544161e1ba4c0a82e21c7d68808529699fd2394ad6cscroggo@google.com    virtual bool supportsTimingIndividualTiles() { return true; }
545161e1ba4c0a82e21c7d68808529699fd2394ad6cscroggo@google.com
546cbcef708914f3b5e9bb63ad3d87261378026e29bscroggo@google.com    /**
547cbcef708914f3b5e9bb63ad3d87261378026e29bscroggo@google.com     * Report the number of tiles in the x and y directions. Must not be called before init.
548cbcef708914f3b5e9bb63ad3d87261378026e29bscroggo@google.com     * @param x Output parameter identifying the number of tiles in the x direction.
549cbcef708914f3b5e9bb63ad3d87261378026e29bscroggo@google.com     * @param y Output parameter identifying the number of tiles in the y direction.
550cbcef708914f3b5e9bb63ad3d87261378026e29bscroggo@google.com     * @return True if the tiles have been set up, and x and y are meaningful. If false, x and y are
551cbcef708914f3b5e9bb63ad3d87261378026e29bscroggo@google.com     *         unmodified.
552cbcef708914f3b5e9bb63ad3d87261378026e29bscroggo@google.com     */
553cbcef708914f3b5e9bb63ad3d87261378026e29bscroggo@google.com    bool tileDimensions(int& x, int&y);
554cbcef708914f3b5e9bb63ad3d87261378026e29bscroggo@google.com
555cbcef708914f3b5e9bb63ad3d87261378026e29bscroggo@google.com    /**
556cbcef708914f3b5e9bb63ad3d87261378026e29bscroggo@google.com     * Move to the next tile and return its indices. Must be called before calling drawCurrentTile
557cbcef708914f3b5e9bb63ad3d87261378026e29bscroggo@google.com     * for the first time.
558cbcef708914f3b5e9bb63ad3d87261378026e29bscroggo@google.com     * @param i Output parameter identifying the column of the next tile to be drawn on the next
559cbcef708914f3b5e9bb63ad3d87261378026e29bscroggo@google.com     *          call to drawNextTile.
560cbcef708914f3b5e9bb63ad3d87261378026e29bscroggo@google.com     * @param j Output parameter identifying the row  of the next tile to be drawn on the next call
561cbcef708914f3b5e9bb63ad3d87261378026e29bscroggo@google.com     *          to drawNextTile.
562cbcef708914f3b5e9bb63ad3d87261378026e29bscroggo@google.com     * @param True if the tiles have been created and the next tile to be drawn by drawCurrentTile
563cbcef708914f3b5e9bb63ad3d87261378026e29bscroggo@google.com     *        is within the range of tiles. If false, i and j are unmodified.
564cbcef708914f3b5e9bb63ad3d87261378026e29bscroggo@google.com     */
565cbcef708914f3b5e9bb63ad3d87261378026e29bscroggo@google.com    bool nextTile(int& i, int& j);
566cbcef708914f3b5e9bb63ad3d87261378026e29bscroggo@google.com
567cbcef708914f3b5e9bb63ad3d87261378026e29bscroggo@google.com    /**
568cbcef708914f3b5e9bb63ad3d87261378026e29bscroggo@google.com     * Render one tile. This will draw the same tile each time it is called until nextTile is
569cbcef708914f3b5e9bb63ad3d87261378026e29bscroggo@google.com     * called. The tile rendered will depend on how many calls have been made to nextTile.
570cbcef708914f3b5e9bb63ad3d87261378026e29bscroggo@google.com     * It is an error to call this without first calling nextTile, or if nextTile returns false.
571cbcef708914f3b5e9bb63ad3d87261378026e29bscroggo@google.com     */
572cbcef708914f3b5e9bb63ad3d87261378026e29bscroggo@google.com    void drawCurrentTile();
573cbcef708914f3b5e9bb63ad3d87261378026e29bscroggo@google.com
574a62da2fee72172a630c2d1dba0e529b357743662scroggo@google.comprotected:
575a62da2fee72172a630c2d1dba0e529b357743662scroggo@google.com    SkTDArray<SkRect> fTileRects;
576451bb9f801d668275394ca5bd57f238e13cf3d17keyar@chromium.org
5770a049b861e18c9c1ede865b8acbcbedc3dd10b43scroggo@google.com    virtual SkCanvas* setupCanvas(int width, int height) SK_OVERRIDE;
5780a049b861e18c9c1ede865b8acbcbedc3dd10b43scroggo@google.com    virtual SkString getConfigNameInternal() SK_OVERRIDE;
5790a049b861e18c9c1ede865b8acbcbedc3dd10b43scroggo@google.com
580451bb9f801d668275394ca5bd57f238e13cf3d17keyar@chromium.orgprivate:
581cbcef708914f3b5e9bb63ad3d87261378026e29bscroggo@google.com    int    fTileWidth;
582cbcef708914f3b5e9bb63ad3d87261378026e29bscroggo@google.com    int    fTileHeight;
583cbcef708914f3b5e9bb63ad3d87261378026e29bscroggo@google.com    double fTileWidthPercentage;
584cbcef708914f3b5e9bb63ad3d87261378026e29bscroggo@google.com    double fTileHeightPercentage;
585cbcef708914f3b5e9bb63ad3d87261378026e29bscroggo@google.com    int    fTileMinPowerOf2Width;
586cbcef708914f3b5e9bb63ad3d87261378026e29bscroggo@google.com
587cbcef708914f3b5e9bb63ad3d87261378026e29bscroggo@google.com    // These variables are only used for timing individual tiles.
588cbcef708914f3b5e9bb63ad3d87261378026e29bscroggo@google.com    // Next tile to draw in fTileRects.
589cbcef708914f3b5e9bb63ad3d87261378026e29bscroggo@google.com    int    fCurrentTileOffset;
590cbcef708914f3b5e9bb63ad3d87261378026e29bscroggo@google.com    // Number of tiles in the x direction.
591cbcef708914f3b5e9bb63ad3d87261378026e29bscroggo@google.com    int    fTilesX;
592cbcef708914f3b5e9bb63ad3d87261378026e29bscroggo@google.com    // Number of tiles in the y direction.
593cbcef708914f3b5e9bb63ad3d87261378026e29bscroggo@google.com    int    fTilesY;
594bcdf2ec50dfd170959cc2db67c49f6dac084be03scroggo@google.com
5959d696c0d04548520af08252e577d2ca88012a239keyar@chromium.org    void setupTiles();
596f4959ab11827bef99e8985031feb457cae1f987akeyar@chromium.org    void setupPowerOf2Tiles();
5979d696c0d04548520af08252e577d2ca88012a239keyar@chromium.org
5989d696c0d04548520af08252e577d2ca88012a239keyar@chromium.org    typedef PictureRenderer INHERITED;
599451bb9f801d668275394ca5bd57f238e13cf3d17keyar@chromium.org};
600451bb9f801d668275394ca5bd57f238e13cf3d17keyar@chromium.org
601a62da2fee72172a630c2d1dba0e529b357743662scroggo@google.comclass CloneData;
602a62da2fee72172a630c2d1dba0e529b357743662scroggo@google.com
603a62da2fee72172a630c2d1dba0e529b357743662scroggo@google.comclass MultiCorePictureRenderer : public TiledPictureRenderer {
604a62da2fee72172a630c2d1dba0e529b357743662scroggo@google.compublic:
605a62da2fee72172a630c2d1dba0e529b357743662scroggo@google.com    explicit MultiCorePictureRenderer(int threadCount);
606a62da2fee72172a630c2d1dba0e529b357743662scroggo@google.com
607a62da2fee72172a630c2d1dba0e529b357743662scroggo@google.com    ~MultiCorePictureRenderer();
608a62da2fee72172a630c2d1dba0e529b357743662scroggo@google.com
6093f0451772109959fcb79bacf2c9a03e0eb39ff27commit-bot@chromium.org    virtual void init(SkPicture* pict, const SkString* writePath, const SkString* mismatchPath,
610f5e315ccf1ae2941f7cf53fa53e5c8c4bb665fe1commit-bot@chromium.org                      const SkString* inputFilename, bool useChecksumBasedFilenames) SK_OVERRIDE;
611a62da2fee72172a630c2d1dba0e529b357743662scroggo@google.com
612a62da2fee72172a630c2d1dba0e529b357743662scroggo@google.com    /**
613a62da2fee72172a630c2d1dba0e529b357743662scroggo@google.com     * Behaves like TiledPictureRenderer::render(), only using multiple threads.
614a62da2fee72172a630c2d1dba0e529b357743662scroggo@google.com     */
615f5e315ccf1ae2941f7cf53fa53e5c8c4bb665fe1commit-bot@chromium.org    virtual bool render(SkBitmap** out = NULL) SK_OVERRIDE;
616a62da2fee72172a630c2d1dba0e529b357743662scroggo@google.com
617a62da2fee72172a630c2d1dba0e529b357743662scroggo@google.com    virtual void end() SK_OVERRIDE;
618a62da2fee72172a630c2d1dba0e529b357743662scroggo@google.com
619161e1ba4c0a82e21c7d68808529699fd2394ad6cscroggo@google.com    virtual bool supportsTimingIndividualTiles() SK_OVERRIDE { return false; }
620161e1ba4c0a82e21c7d68808529699fd2394ad6cscroggo@google.com
621a62da2fee72172a630c2d1dba0e529b357743662scroggo@google.comprivate:
6220a049b861e18c9c1ede865b8acbcbedc3dd10b43scroggo@google.com    virtual SkString getConfigNameInternal() SK_OVERRIDE;
6230a049b861e18c9c1ede865b8acbcbedc3dd10b43scroggo@google.com
624a62da2fee72172a630c2d1dba0e529b357743662scroggo@google.com    const int            fNumThreads;
625a62da2fee72172a630c2d1dba0e529b357743662scroggo@google.com    SkTDArray<SkCanvas*> fCanvasPool;
626a62da2fee72172a630c2d1dba0e529b357743662scroggo@google.com    SkThreadPool         fThreadPool;
627a62da2fee72172a630c2d1dba0e529b357743662scroggo@google.com    SkPicture*           fPictureClones;
628a62da2fee72172a630c2d1dba0e529b357743662scroggo@google.com    CloneData**          fCloneData;
629a62da2fee72172a630c2d1dba0e529b357743662scroggo@google.com    SkCountdown          fCountdown;
630a62da2fee72172a630c2d1dba0e529b357743662scroggo@google.com
631a62da2fee72172a630c2d1dba0e529b357743662scroggo@google.com    typedef TiledPictureRenderer INHERITED;
632a62da2fee72172a630c2d1dba0e529b357743662scroggo@google.com};
633a62da2fee72172a630c2d1dba0e529b357743662scroggo@google.com
6349a4125283ad56cea3b986337cb669dde14bf0ed8scroggo@google.com/**
6359a4125283ad56cea3b986337cb669dde14bf0ed8scroggo@google.com * This class does not do any rendering, but its render function executes turning an SkPictureRecord
6369a4125283ad56cea3b986337cb669dde14bf0ed8scroggo@google.com * into an SkPicturePlayback, which we want to time.
6379a4125283ad56cea3b986337cb669dde14bf0ed8scroggo@google.com */
6389a4125283ad56cea3b986337cb669dde14bf0ed8scroggo@google.comclass PlaybackCreationRenderer : public PictureRenderer {
6399a4125283ad56cea3b986337cb669dde14bf0ed8scroggo@google.compublic:
6409a4125283ad56cea3b986337cb669dde14bf0ed8scroggo@google.com    virtual void setup() SK_OVERRIDE;
6419a4125283ad56cea3b986337cb669dde14bf0ed8scroggo@google.com
642f5e315ccf1ae2941f7cf53fa53e5c8c4bb665fe1commit-bot@chromium.org    virtual bool render(SkBitmap** out = NULL) SK_OVERRIDE;
6439a4125283ad56cea3b986337cb669dde14bf0ed8scroggo@google.com
6449a4125283ad56cea3b986337cb669dde14bf0ed8scroggo@google.com    virtual SkString getPerIterTimeFormat() SK_OVERRIDE { return SkString("%.4f"); }
6459a4125283ad56cea3b986337cb669dde14bf0ed8scroggo@google.com
6469a4125283ad56cea3b986337cb669dde14bf0ed8scroggo@google.com    virtual SkString getNormalTimeFormat() SK_OVERRIDE { return SkString("%6.4f"); }
6479a4125283ad56cea3b986337cb669dde14bf0ed8scroggo@google.com
6489a4125283ad56cea3b986337cb669dde14bf0ed8scroggo@google.comprivate:
64984b18c7e3e042bf206e1ace3d1b6ea5bb929fe51robertphillips@google.com    SkAutoTDelete<SkPictureRecorder> fRecorder;
6500a049b861e18c9c1ede865b8acbcbedc3dd10b43scroggo@google.com
6510a049b861e18c9c1ede865b8acbcbedc3dd10b43scroggo@google.com    virtual SkString getConfigNameInternal() SK_OVERRIDE;
6520a049b861e18c9c1ede865b8acbcbedc3dd10b43scroggo@google.com
6539a4125283ad56cea3b986337cb669dde14bf0ed8scroggo@google.com    typedef PictureRenderer INHERITED;
6549a4125283ad56cea3b986337cb669dde14bf0ed8scroggo@google.com};
6559a4125283ad56cea3b986337cb669dde14bf0ed8scroggo@google.com
656fe7b1ed30a75cecfe80d1ba4d1f60295e99aeef0reed@google.comextern PictureRenderer* CreateGatherPixelRefsRenderer();
6575a34fd3f9876174aea8b22e1b585b4244e71b0b1reed@google.comextern PictureRenderer* CreatePictureCloneRenderer();
658fe7b1ed30a75cecfe80d1ba4d1f60295e99aeef0reed@google.com
659451bb9f801d668275394ca5bd57f238e13cf3d17keyar@chromium.org}
660451bb9f801d668275394ca5bd57f238e13cf3d17keyar@chromium.org
661451bb9f801d668275394ca5bd57f238e13cf3d17keyar@chromium.org#endif  // PictureRenderer_DEFINED
662