14370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com/* 29ed02b9da25a76ee4c73c1ab19c18b899a223a17junov@chromium.org * Copyright 2012 Google Inc. 34370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com * 44370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com * Use of this source code is governed by a BSD-style license that can be 54370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com * found in the LICENSE file. 64370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com */ 74370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com 84370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com#ifndef SkDeferredCanvas_DEFINED 94370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com#define SkDeferredCanvas_DEFINED 104370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com 114370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com#include "SkCanvas.h" 124370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com#include "SkPixelRef.h" 134370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com 149c135db83d198e7d8200027c7d2cf60f38517ee3reed@google.comclass SkDeferredDevice; 1567d74228448cab0f1eca77fff444ddbe8c2eaef3junov@chromium.orgclass SkImage; 1667d74228448cab0f1eca77fff444ddbe8c2eaef3junov@chromium.orgclass SkSurface; 1777eec248cbd5a0c2f5f8595e62e3bff5ea363f17junov@chromium.org 184370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com/** \class SkDeferredCanvas 1977eec248cbd5a0c2f5f8595e62e3bff5ea363f17junov@chromium.org Subclass of SkCanvas that encapsulates an SkPicture or SkGPipe for deferred 2077eec248cbd5a0c2f5f8595e62e3bff5ea363f17junov@chromium.org drawing. The main difference between this class and SkPictureRecord (the 2177eec248cbd5a0c2f5f8595e62e3bff5ea363f17junov@chromium.org canvas provided by SkPicture) is that this is a full drop-in replacement 2277eec248cbd5a0c2f5f8595e62e3bff5ea363f17junov@chromium.org for SkCanvas, while SkPictureRecord only supports draw operations. 234370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com SkDeferredCanvas will transparently trigger the flushing of deferred 2474b461961607fa57a150a9282c410ef0cab38764vandebo@chromium.org draw operations when an attempt is made to access the pixel data. 254370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com*/ 264370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.comclass SK_API SkDeferredCanvas : public SkCanvas { 274370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.compublic: 28eddb02c82d6e35a05f84798b23aac48a446c1aa6commit-bot@chromium.org class SK_API NotificationClient; 294370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com 3066070a527c480d1cef5f7f7136f68d4f17b68f06junov@chromium.org /** Construct a canvas with the specified surface to draw into. 3166070a527c480d1cef5f7f7136f68d4f17b68f06junov@chromium.org This factory must be used for newImageSnapshot to work. 3266070a527c480d1cef5f7f7136f68d4f17b68f06junov@chromium.org @param surface Specifies a surface for the canvas to draw into. 3366070a527c480d1cef5f7f7136f68d4f17b68f06junov@chromium.org */ 3466070a527c480d1cef5f7f7136f68d4f17b68f06junov@chromium.org static SkDeferredCanvas* Create(SkSurface* surface); 3566070a527c480d1cef5f7f7136f68d4f17b68f06junov@chromium.org 3628183b4043a969df12592e8dd47cf95b80755284reed@google.com// static SkDeferredCanvas* Create(SkBaseDevice* device); 3767d74228448cab0f1eca77fff444ddbe8c2eaef3junov@chromium.org 384370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com virtual ~SkDeferredCanvas(); 394370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com 404370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com /** 417070f76b90b098b4713bc0d13dc129adea64d7efjunov@chromium.org * Specify the surface to be used by this canvas. Calling setSurface will 427070f76b90b098b4713bc0d13dc129adea64d7efjunov@chromium.org * release the previously set surface or device. Takes a reference on the 437070f76b90b098b4713bc0d13dc129adea64d7efjunov@chromium.org * surface. 447070f76b90b098b4713bc0d13dc129adea64d7efjunov@chromium.org * 457070f76b90b098b4713bc0d13dc129adea64d7efjunov@chromium.org * @param surface The surface that the canvas will raw into 467070f76b90b098b4713bc0d13dc129adea64d7efjunov@chromium.org * @return The surface argument, for convenience. 477070f76b90b098b4713bc0d13dc129adea64d7efjunov@chromium.org */ 487070f76b90b098b4713bc0d13dc129adea64d7efjunov@chromium.org SkSurface* setSurface(SkSurface* surface); 497070f76b90b098b4713bc0d13dc129adea64d7efjunov@chromium.org 507070f76b90b098b4713bc0d13dc129adea64d7efjunov@chromium.org /** 519ed02b9da25a76ee4c73c1ab19c18b899a223a17junov@chromium.org * Specify a NotificationClient to be used by this canvas. Calling 52fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com * setNotificationClient will release the previously set 5352805485581cff7e13134aa1465a2950f7bed007junov@chromium.org * NotificationClient, if any. SkDeferredCanvas does not take ownership 5452805485581cff7e13134aa1465a2950f7bed007junov@chromium.org * of the notification client. Therefore user code is resposible 5552805485581cff7e13134aa1465a2950f7bed007junov@chromium.org * for its destruction. The notification client must be unregistered 5652805485581cff7e13134aa1465a2950f7bed007junov@chromium.org * by calling setNotificationClient(NULL) if it is destroyed before 5752805485581cff7e13134aa1465a2950f7bed007junov@chromium.org * this canvas. 584370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com * Note: Must be called after the device is set with setDevice. 594370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com * 609ed02b9da25a76ee4c73c1ab19c18b899a223a17junov@chromium.org * @param notificationClient interface for dispatching notifications 619ed02b9da25a76ee4c73c1ab19c18b899a223a17junov@chromium.org * @return The notificationClient argument, for convenience. 624370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com */ 639ed02b9da25a76ee4c73c1ab19c18b899a223a17junov@chromium.org NotificationClient* setNotificationClient(NotificationClient* notificationClient); 644370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com 654370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com /** 664370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com * Enable or disable deferred drawing. When deferral is disabled, 674370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com * pending draw operations are immediately flushed and from then on, 684370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com * the SkDeferredCanvas behaves just like a regular SkCanvas. 694370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com * This method must not be called while the save/restore stack is in use. 704370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com * @param deferred true/false 714370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com */ 724370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com void setDeferredDrawing(bool deferred); 734370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com 74bfeddae9da240693441556b2f278827e213f75e8junov@chromium.org /** 75b10a6bd0a7df0ceeea0d53585c049450ec58b4b9junov@chromium.org * Returns true if deferred drawing is currenlty enabled. 76b10a6bd0a7df0ceeea0d53585c049450ec58b4b9junov@chromium.org */ 7788e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org bool isDeferredDrawing() const; 7888e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org 7988e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org /** 80fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com * Returns true if the canvas contains a fresh frame. A frame is 8188e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org * considered fresh when its content do not depend on the contents 8288e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org * of the previous frame. For example, if a canvas is cleared before 8388e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org * drawing each frame, the frames will all be considered fresh. 8488e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org * A frame is defined as the graphics image produced by as a result 8588e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org * of all the canvas draws operation executed between two successive 8688e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org * calls to isFreshFrame. The result of isFreshFrame is computed 8788e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org * conservatively, so it may report false negatives. 8888e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org */ 8988e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org bool isFreshFrame() const; 90b10a6bd0a7df0ceeea0d53585c049450ec58b4b9junov@chromium.org 91b10a6bd0a7df0ceeea0d53585c049450ec58b4b9junov@chromium.org /** 9249005bf8929dd8ca86431e13414d683b509cd538yunchao.he * Returns canvas's size. 9349005bf8929dd8ca86431e13414d683b509cd538yunchao.he */ 9449005bf8929dd8ca86431e13414d683b509cd538yunchao.he SkISize getCanvasSize() const; 9549005bf8929dd8ca86431e13414d683b509cd538yunchao.he 9649005bf8929dd8ca86431e13414d683b509cd538yunchao.he /** 97a38dfb6981379770221b16b5ec036b08f3005973junov@chromium.org * Returns true if the canvas has recorded draw commands that have 98a38dfb6981379770221b16b5ec036b08f3005973junov@chromium.org * not yet been played back. 99a38dfb6981379770221b16b5ec036b08f3005973junov@chromium.org */ 100a38dfb6981379770221b16b5ec036b08f3005973junov@chromium.org bool hasPendingCommands() const; 101a38dfb6981379770221b16b5ec036b08f3005973junov@chromium.org 102a38dfb6981379770221b16b5ec036b08f3005973junov@chromium.org /** 10367d74228448cab0f1eca77fff444ddbe8c2eaef3junov@chromium.org * Flushes pending draw commands, if any, and returns an image of the 10467d74228448cab0f1eca77fff444ddbe8c2eaef3junov@chromium.org * current state of the surface pixels up to this point. Subsequent 10567d74228448cab0f1eca77fff444ddbe8c2eaef3junov@chromium.org * changes to the surface (by drawing into its canvas) will not be 10667d74228448cab0f1eca77fff444ddbe8c2eaef3junov@chromium.org * reflected in this image. Will return NULL if the deferred canvas 10767d74228448cab0f1eca77fff444ddbe8c2eaef3junov@chromium.org * was not constructed from an SkSurface. 10867d74228448cab0f1eca77fff444ddbe8c2eaef3junov@chromium.org */ 1095ee449af7448c202cfc6e9a359d8f996392885b2junov@chromium.org SkImage* newImageSnapshot(); 11067d74228448cab0f1eca77fff444ddbe8c2eaef3junov@chromium.org 11167d74228448cab0f1eca77fff444ddbe8c2eaef3junov@chromium.org /** 112bfeddae9da240693441556b2f278827e213f75e8junov@chromium.org * Specify the maximum number of bytes to be allocated for the purpose 113bfeddae9da240693441556b2f278827e213f75e8junov@chromium.org * of recording draw commands to this canvas. The default limit, is 114bfeddae9da240693441556b2f278827e213f75e8junov@chromium.org * 64MB. 115bfeddae9da240693441556b2f278827e213f75e8junov@chromium.org * @param maxStorage The maximum number of bytes to be allocated. 116bfeddae9da240693441556b2f278827e213f75e8junov@chromium.org */ 117bfeddae9da240693441556b2f278827e213f75e8junov@chromium.org void setMaxRecordingStorage(size_t maxStorage); 118bfeddae9da240693441556b2f278827e213f75e8junov@chromium.org 1192e14ba8ceb41c68042ff133fecf0561a2c22efcajunov@chromium.org /** 1202e14ba8ceb41c68042ff133fecf0561a2c22efcajunov@chromium.org * Returns the number of bytes currently allocated for the purpose of 1212e14ba8ceb41c68042ff133fecf0561a2c22efcajunov@chromium.org * recording draw commands. 1222e14ba8ceb41c68042ff133fecf0561a2c22efcajunov@chromium.org */ 1232e14ba8ceb41c68042ff133fecf0561a2c22efcajunov@chromium.org size_t storageAllocatedForRecording() const; 1242e14ba8ceb41c68042ff133fecf0561a2c22efcajunov@chromium.org 1252e14ba8ceb41c68042ff133fecf0561a2c22efcajunov@chromium.org /** 1262e14ba8ceb41c68042ff133fecf0561a2c22efcajunov@chromium.org * Attempt to reduce the storage allocated for recording by evicting 1272e14ba8ceb41c68042ff133fecf0561a2c22efcajunov@chromium.org * cache resources. 1282e14ba8ceb41c68042ff133fecf0561a2c22efcajunov@chromium.org * @param bytesToFree minimum number of bytes that should be attempted to 1292e14ba8ceb41c68042ff133fecf0561a2c22efcajunov@chromium.org * be freed. 1302e14ba8ceb41c68042ff133fecf0561a2c22efcajunov@chromium.org * @return number of bytes actually freed. 1312e14ba8ceb41c68042ff133fecf0561a2c22efcajunov@chromium.org */ 1322e14ba8ceb41c68042ff133fecf0561a2c22efcajunov@chromium.org size_t freeMemoryIfPossible(size_t bytesToFree); 1332e14ba8ceb41c68042ff133fecf0561a2c22efcajunov@chromium.org 134fb10389403cf1cc771e103016207fde84c5f4825junov@chromium.org /** 1357775fd5779e632d6f5724e0e5d39ed347cf965b0sugoi@google.com * Specifies the maximum size (in bytes) allowed for a given image to be 1367775fd5779e632d6f5724e0e5d39ed347cf965b0sugoi@google.com * rendered using the deferred canvas. 1377775fd5779e632d6f5724e0e5d39ed347cf965b0sugoi@google.com */ 1387775fd5779e632d6f5724e0e5d39ed347cf965b0sugoi@google.com void setBitmapSizeThreshold(size_t sizeThreshold); 13952d9ac6c92ddf33b3b05eb77ba9509a7aa441657reed size_t getBitmapSizeThreshold() const { return fBitmapSizeThreshold; } 1407775fd5779e632d6f5724e0e5d39ed347cf965b0sugoi@google.com 1417775fd5779e632d6f5724e0e5d39ed347cf965b0sugoi@google.com /** 142fb10389403cf1cc771e103016207fde84c5f4825junov@chromium.org * Executes all pending commands without drawing 143fb10389403cf1cc771e103016207fde84c5f4825junov@chromium.org */ 144fb10389403cf1cc771e103016207fde84c5f4825junov@chromium.org void silentFlush(); 145fb10389403cf1cc771e103016207fde84c5f4825junov@chromium.org 14636352bf5e38f45a70ee4f4fc132a38048d38206dmtklein SkDrawFilter* setDrawFilter(SkDrawFilter* filter) override; 1474370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com 148ab5827354e2c23624acc3fc1fe4a83788bc99e96commit-bot@chromium.orgprotected: 14936352bf5e38f45a70ee4f4fc132a38048d38206dmtklein void willSave() override; 15036352bf5e38f45a70ee4f4fc132a38048d38206dmtklein SaveLayerStrategy willSaveLayer(const SkRect*, const SkPaint*, SaveFlags) override; 15136352bf5e38f45a70ee4f4fc132a38048d38206dmtklein void willRestore() override; 152e54a23fcfa42b2fc9d320650de72bcb2d9566b2dcommit-bot@chromium.org 15336352bf5e38f45a70ee4f4fc132a38048d38206dmtklein void didConcat(const SkMatrix&) override; 15436352bf5e38f45a70ee4f4fc132a38048d38206dmtklein void didSetMatrix(const SkMatrix&) override; 15544c48d062f7996b5b46917e1b312a32ad101f326commit-bot@chromium.org 15636352bf5e38f45a70ee4f4fc132a38048d38206dmtklein void onDrawDRRect(const SkRRect&, const SkRRect&, const SkPaint&) override; 157e0d9ce890e67d02727ac2811bb456ddb64f827d4reed@google.com virtual void onDrawText(const void* text, size_t byteLength, SkScalar x, SkScalar y, 15836352bf5e38f45a70ee4f4fc132a38048d38206dmtklein const SkPaint&) override; 159e0d9ce890e67d02727ac2811bb456ddb64f827d4reed@google.com virtual void onDrawPosText(const void* text, size_t byteLength, const SkPoint pos[], 16036352bf5e38f45a70ee4f4fc132a38048d38206dmtklein const SkPaint&) override; 161e0d9ce890e67d02727ac2811bb456ddb64f827d4reed@google.com virtual void onDrawPosTextH(const void* text, size_t byteLength, const SkScalar xpos[], 16236352bf5e38f45a70ee4f4fc132a38048d38206dmtklein SkScalar constY, const SkPaint&) override; 163e0d9ce890e67d02727ac2811bb456ddb64f827d4reed@google.com virtual void onDrawTextOnPath(const void* text, size_t byteLength, const SkPath& path, 16436352bf5e38f45a70ee4f4fc132a38048d38206dmtklein const SkMatrix* matrix, const SkPaint&) override; 165b7425173f96e93b090787e2386ba5f022b6c2869fmalita virtual void onDrawTextBlob(const SkTextBlob* blob, SkScalar x, SkScalar y, 16636352bf5e38f45a70ee4f4fc132a38048d38206dmtklein const SkPaint& paint) override; 167b3c9d1c33caf325aada244204215eb790c228c12dandov virtual void onDrawPatch(const SkPoint cubics[12], const SkColor colors[4], 168b3c9d1c33caf325aada244204215eb790c228c12dandov const SkPoint texCoords[4], SkXfermode* xmode, 16936352bf5e38f45a70ee4f4fc132a38048d38206dmtklein const SkPaint& paint) override; 17036352bf5e38f45a70ee4f4fc132a38048d38206dmtklein 17136352bf5e38f45a70ee4f4fc132a38048d38206dmtklein void onDrawPaint(const SkPaint&) override; 17236352bf5e38f45a70ee4f4fc132a38048d38206dmtklein void onDrawPoints(PointMode, size_t count, const SkPoint pts[], const SkPaint&) override; 17336352bf5e38f45a70ee4f4fc132a38048d38206dmtklein void onDrawRect(const SkRect&, const SkPaint&) override; 17436352bf5e38f45a70ee4f4fc132a38048d38206dmtklein void onDrawOval(const SkRect&, const SkPaint&) override; 17536352bf5e38f45a70ee4f4fc132a38048d38206dmtklein void onDrawRRect(const SkRRect&, const SkPaint&) override; 17636352bf5e38f45a70ee4f4fc132a38048d38206dmtklein void onDrawPath(const SkPath&, const SkPaint&) override; 17736352bf5e38f45a70ee4f4fc132a38048d38206dmtklein void onDrawBitmap(const SkBitmap&, SkScalar left, SkScalar top, const SkPaint*) override; 17841af966ab338e95eee81ab618ab28195075338f7reed void onDrawBitmapRect(const SkBitmap&, const SkRect* src, const SkRect& dst, const SkPaint*, 17936352bf5e38f45a70ee4f4fc132a38048d38206dmtklein DrawBitmapRectFlags flags) override; 18036352bf5e38f45a70ee4f4fc132a38048d38206dmtklein void onDrawImage(const SkImage*, SkScalar left, SkScalar top, const SkPaint*) override; 18141af966ab338e95eee81ab618ab28195075338f7reed void onDrawImageRect(const SkImage*, const SkRect* src, const SkRect& dst, 18236352bf5e38f45a70ee4f4fc132a38048d38206dmtklein const SkPaint*) override; 18341af966ab338e95eee81ab618ab28195075338f7reed void onDrawBitmapNine(const SkBitmap&, const SkIRect& center, const SkRect& dst, 18436352bf5e38f45a70ee4f4fc132a38048d38206dmtklein const SkPaint*) override; 18536352bf5e38f45a70ee4f4fc132a38048d38206dmtklein void onDrawSprite(const SkBitmap&, int left, int top, const SkPaint*) override; 18641af966ab338e95eee81ab618ab28195075338f7reed void onDrawVertices(VertexMode vmode, int vertexCount, 18741af966ab338e95eee81ab618ab28195075338f7reed const SkPoint vertices[], const SkPoint texs[], 18841af966ab338e95eee81ab618ab28195075338f7reed const SkColor colors[], SkXfermode* xmode, 18941af966ab338e95eee81ab618ab28195075338f7reed const uint16_t indices[], int indexCount, 19036352bf5e38f45a70ee4f4fc132a38048d38206dmtklein const SkPaint&) override; 19141af966ab338e95eee81ab618ab28195075338f7reed 19236352bf5e38f45a70ee4f4fc132a38048d38206dmtklein void onClipRect(const SkRect&, SkRegion::Op, ClipEdgeStyle) override; 19336352bf5e38f45a70ee4f4fc132a38048d38206dmtklein void onClipRRect(const SkRRect&, SkRegion::Op, ClipEdgeStyle) override; 19436352bf5e38f45a70ee4f4fc132a38048d38206dmtklein void onClipPath(const SkPath&, SkRegion::Op, ClipEdgeStyle) override; 19536352bf5e38f45a70ee4f4fc132a38048d38206dmtklein void onClipRegion(const SkRegion&, SkRegion::Op) override; 1968f90a892c5130d4d26b5588e1ff151d01a40688arobertphillips@google.com 19736352bf5e38f45a70ee4f4fc132a38048d38206dmtklein void onDrawPicture(const SkPicture*, const SkMatrix*, const SkPaint*) override; 1989b14f26d0f3a974f3dd626c8354e1db1cfcd322frobertphillips 1994370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.compublic: 20052805485581cff7e13134aa1465a2950f7bed007junov@chromium.org class NotificationClient { 2014370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com public: 2025990397d08640a80a7ccb3955b9952b356be3f86robertphillips@google.com virtual ~NotificationClient() {} 2035990397d08640a80a7ccb3955b9952b356be3f86robertphillips@google.com 2049ed02b9da25a76ee4c73c1ab19c18b899a223a17junov@chromium.org /** 2059ed02b9da25a76ee4c73c1ab19c18b899a223a17junov@chromium.org * Called before executing one or several draw commands, which means 2069ed02b9da25a76ee4c73c1ab19c18b899a223a17junov@chromium.org * once per flush when deferred rendering is enabled. 2079ed02b9da25a76ee4c73c1ab19c18b899a223a17junov@chromium.org */ 2084370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com virtual void prepareForDraw() {} 2099ed02b9da25a76ee4c73c1ab19c18b899a223a17junov@chromium.org 2109ed02b9da25a76ee4c73c1ab19c18b899a223a17junov@chromium.org /** 2119ed02b9da25a76ee4c73c1ab19c18b899a223a17junov@chromium.org * Called after a recording a draw command if additional memory 2129ed02b9da25a76ee4c73c1ab19c18b899a223a17junov@chromium.org * had to be allocated for recording. 213fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com * @param newAllocatedStorage same value as would be returned by 2149ed02b9da25a76ee4c73c1ab19c18b899a223a17junov@chromium.org * storageAllocatedForRecording(), for convenience. 2159ed02b9da25a76ee4c73c1ab19c18b899a223a17junov@chromium.org */ 216c87dd2ce965cd1bbc8a74abe0c141658a469d7f2djsollen virtual void storageAllocatedForRecordingChanged(size_t /*newAllocatedStorage*/) {} 2179ed02b9da25a76ee4c73c1ab19c18b899a223a17junov@chromium.org 2189ed02b9da25a76ee4c73c1ab19c18b899a223a17junov@chromium.org /** 2199ed02b9da25a76ee4c73c1ab19c18b899a223a17junov@chromium.org * Called after pending draw commands have been flushed 2209ed02b9da25a76ee4c73c1ab19c18b899a223a17junov@chromium.org */ 2219ed02b9da25a76ee4c73c1ab19c18b899a223a17junov@chromium.org virtual void flushedDrawCommands() {} 222fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com 22352a00cac514dfd9cedb85a9c3e92fdb3e32a03f7junov@google.com /** 22452a00cac514dfd9cedb85a9c3e92fdb3e32a03f7junov@google.com * Called after pending draw commands have been skipped, meaning 22552a00cac514dfd9cedb85a9c3e92fdb3e32a03f7junov@google.com * that they were optimized-out because the canvas is cleared 22652a00cac514dfd9cedb85a9c3e92fdb3e32a03f7junov@google.com * or completely overwritten by the command currently being recorded. 22752a00cac514dfd9cedb85a9c3e92fdb3e32a03f7junov@google.com */ 22852a00cac514dfd9cedb85a9c3e92fdb3e32a03f7junov@google.com virtual void skippedPendingDrawCommands() {} 2294370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com }; 2304370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com 23177eec248cbd5a0c2f5f8595e62e3bff5ea363f17junov@chromium.orgprotected: 23236352bf5e38f45a70ee4f4fc132a38048d38206dmtklein SkCanvas* canvasForDrawIter() override; 2339c135db83d198e7d8200027c7d2cf60f38517ee3reed@google.com SkDeferredDevice* getDeferredDevice() const; 2344370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com 2354370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.comprivate: 2369c135db83d198e7d8200027c7d2cf60f38517ee3reed@google.com SkDeferredCanvas(SkDeferredDevice*); 23766070a527c480d1cef5f7f7136f68d4f17b68f06junov@chromium.org 2389ed02b9da25a76ee4c73c1ab19c18b899a223a17junov@chromium.org void recordedDrawCommand(); 2395e5a095a94281167056da707b03930f135748d71junov@chromium.org SkCanvas* drawingCanvas() const; 24088e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org SkCanvas* immediateCanvas() const; 2414370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com bool isFullFrame(const SkRect*, const SkPaint*) const; 2424370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com void validate() const; 2434370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com void init(); 24452d9ac6c92ddf33b3b05eb77ba9509a7aa441657reed 2453fcc125c776c837aa858598ce385f5c6f8f01795junov 2463fcc125c776c837aa858598ce385f5c6f8f01795junov int fSaveLevel; 2473fcc125c776c837aa858598ce385f5c6f8f01795junov int fFirstSaveLayerIndex; 24852d9ac6c92ddf33b3b05eb77ba9509a7aa441657reed size_t fBitmapSizeThreshold; 24952d9ac6c92ddf33b3b05eb77ba9509a7aa441657reed bool fDeferredDrawing; 2504370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com 25149005bf8929dd8ca86431e13414d683b509cd538yunchao.he mutable SkISize fCachedCanvasSize; 25249005bf8929dd8ca86431e13414d683b509cd538yunchao.he mutable bool fCachedCanvasSizeDirty; 25349005bf8929dd8ca86431e13414d683b509cd538yunchao.he 25488e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org friend class SkDeferredCanvasTester; // for unit testing 2554370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com typedef SkCanvas INHERITED; 2564370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com}; 2574370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com 2584370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com 2594370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com#endif 260