SkCanvas.h revision 35e2e62b55598210f6999fc2ea26ff8f41446ffe
10910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project/*
20910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project * Copyright (C) 2006 The Android Open Source Project
30910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project *
40910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
50910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project * you may not use this file except in compliance with the License.
60910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project * You may obtain a copy of the License at
70910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project *
80910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
90910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project *
100910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
110910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
120910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
130910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project * See the License for the specific language governing permissions and
140910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project * limitations under the License.
150910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project */
160910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
170910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#ifndef SkCanvas_DEFINED
180910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define SkCanvas_DEFINED
190910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
200910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkTypes.h"
210910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkBitmap.h"
220910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkDeque.h"
2371531ca1f484da5837be8017a0c83e5bff701587Derek Sollenberger#include "SkClipStack.h"
240910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkPaint.h"
250910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkRefCnt.h"
260910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkPath.h"
270910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkRegion.h"
280910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkScalarCompare.h"
2959f59bde0b05a6ac5ff28fdebc1942dbf0d43aabMike Reed#include "SkXfermode.h"
300910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
310910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectclass SkBounder;
320910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectclass SkDevice;
3320ab88413000fcc8668eeab25d9cb714097d0c45tedboclass SkDeviceFactory;
340910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectclass SkDraw;
350910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectclass SkDrawFilter;
360910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectclass SkPicture;
37dab163f0b2658c2dba48839e72f81d3d8ee0ae8bMike Reedclass SkShape;
380910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
390910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project/** \class SkCanvas
400910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
410910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    A Canvas encapsulates all of the state about drawing into a device (bitmap).
420910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    This includes a reference to the device itself, and a stack of matrix/clip
430910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    values. For any given draw call (e.g. drawRect), the geometry of the object
440910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    being drawn is transformed by the concatenation of all the matrices in the
450910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    stack. The transformed geometry is clipped by the intersection of all of
460910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    the clips in the stack.
470910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
480910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    While the Canvas holds the state of the drawing device, the state (style)
490910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    of the object being drawn is held by the Paint, which is provided as a
500910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    parameter to each of the draw() methods. The Paint holds attributes such as
510910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    color, typeface, textSize, strokeWidth, shader (e.g. gradients, patterns),
520910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    etc.
530910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project*/
54137a4ca42423bbb6d683067ea544c9a48f18f06cDerek Sollenbergerclass SK_API SkCanvas : public SkRefCnt {
550910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectpublic:
5620ab88413000fcc8668eeab25d9cb714097d0c45tedbo    /** Construct a canvas with the given device factory.
5720ab88413000fcc8668eeab25d9cb714097d0c45tedbo        @param factory  Specify the factory for generating additional devices.
5820ab88413000fcc8668eeab25d9cb714097d0c45tedbo                        The factory may be null, in which case
5920ab88413000fcc8668eeab25d9cb714097d0c45tedbo                        SkRasterDeviceFactory will be used.
6020ab88413000fcc8668eeab25d9cb714097d0c45tedbo    */
6120ab88413000fcc8668eeab25d9cb714097d0c45tedbo    explicit SkCanvas(SkDeviceFactory* factory = NULL);
6220ab88413000fcc8668eeab25d9cb714097d0c45tedbo
6320ab88413000fcc8668eeab25d9cb714097d0c45tedbo    /** Construct a canvas with the specified device to draw into.  The device
6420ab88413000fcc8668eeab25d9cb714097d0c45tedbo        factory will be retrieved from the passed device.
6520ab88413000fcc8668eeab25d9cb714097d0c45tedbo        @param device   Specifies a device for the canvas to draw into.
6620ab88413000fcc8668eeab25d9cb714097d0c45tedbo    */
6720ab88413000fcc8668eeab25d9cb714097d0c45tedbo    explicit SkCanvas(SkDevice* device);
6820ab88413000fcc8668eeab25d9cb714097d0c45tedbo
6920ab88413000fcc8668eeab25d9cb714097d0c45tedbo    /** Deprecated - Construct a canvas with the specified bitmap to draw into.
700910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param bitmap   Specifies a bitmap for the canvas to draw into. Its
710910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                        structure are copied to the canvas.
720910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    */
730910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    explicit SkCanvas(const SkBitmap& bitmap);
740910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    virtual ~SkCanvas();
750910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
760910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    ///////////////////////////////////////////////////////////////////////////
770910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
780910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    /** Return the canvas' device object, which may be null. The device holds
790910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        the bitmap of the pixels that the canvas draws into. The reference count
800910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        of the returned device is not changed by this call.
810910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    */
820910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkDevice* getDevice() const;
830910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
840910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    /** Specify a device for this canvas to draw into. If it is not null, its
850910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        reference count is incremented. If the canvas was already holding a
860910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        device, its reference count is decremented. The new device is returned.
870910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    */
880910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkDevice* setDevice(SkDevice* device);
8920ab88413000fcc8668eeab25d9cb714097d0c45tedbo
9087b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger    /**
9187b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger     *  saveLayer() can create another device (which is later drawn onto
9287b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger     *  the previous device). getTopDevice() returns the top-most device current
9387b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger     *  installed. Note that this can change on other calls like save/restore,
9487b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger     *  so do not access this device after subsequent canvas calls.
9587b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger     *  The reference count of the device is not changed.
9687b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger     */
9787b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger    SkDevice* getTopDevice() const;
9887b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger
9940528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger    /** May be overridden by subclasses. This returns a compatible device
10040528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger        for this canvas, with the specified config/width/height. If the device
10140528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger        is raster, the pixels will be allocated automatically.
10240528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger     */
10340528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger    virtual SkDevice* createDevice(SkBitmap::Config, int width, int height,
10440528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger                                   bool isOpaque, bool forLayer = false);
10540528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger
10640528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger    /**
10740528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger     *  Create a new raster device and make it current. This also returns
10840528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger     *  the new device.
10940528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger     */
11040528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger    SkDevice* setBitmapDevice(const SkBitmap& bitmap, bool forLayer = false);
11140528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger
11240528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger    /**
11335e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger     *  Return the current device factory, or NULL. The reference count of
11435e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger     *  the returned factory is not changed.
11540528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger     */
11640528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger    SkDeviceFactory* getDeviceFactory() const { return fDeviceFactory; }
11740528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger
11840528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger    /**
11935e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger     *  Replace any existing factory with the specified factory, unrefing the
12035e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger     *  previous (if any), and refing the new one (if any). For convenience,
12135e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger     *  the factory parameter is also returned.
12240528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger     */
12340528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger    SkDeviceFactory* setDeviceFactory(SkDeviceFactory*);
12440528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger
12540528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger    ///////////////////////////////////////////////////////////////////////////
12640528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger
12740528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger    /**
12840528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger     *  Copy the pixels from the device into bitmap. Returns true on success.
12940528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger     *  If false is returned, then the bitmap parameter is left unchanged.
13040528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger     *  The bitmap parameter is treated as output-only, and will be completely
13140528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger     *  overwritten (if the method returns true).
13240528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger     */
13340528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger    bool readPixels(const SkIRect& srcRect, SkBitmap* bitmap);
13440528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger    bool readPixels(SkBitmap* bitmap);
13540528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger
13640528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger    /**
13740528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger     *  Similar to draw sprite, this method will copy the pixels in bitmap onto
13840528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger     *  the device, with the top/left corner specified by (x, y). The pixel
13940528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger     *  values in the device are completely replaced: there is no blending.
14040528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger     */
14140528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger    void writePixels(const SkBitmap& bitmap, int x, int y);
1420910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1430910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    ///////////////////////////////////////////////////////////////////////////
14420ab88413000fcc8668eeab25d9cb714097d0c45tedbo
1450910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    enum SaveFlags {
1460910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        /** save the matrix state, restoring it on restore() */
1470910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        kMatrix_SaveFlag            = 0x01,
1480910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        /** save the clip state, restoring it on restore() */
1490910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        kClip_SaveFlag              = 0x02,
1500910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        /** the layer needs to support per-pixel alpha */
1510910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        kHasAlphaLayer_SaveFlag     = 0x04,
1520910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        /** the layer needs to support 8-bits per color component */
1530910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        kFullColorLayer_SaveFlag    = 0x08,
1540910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        /** the layer should clip against the bounds argument */
1550910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        kClipToLayer_SaveFlag       = 0x10,
1560910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1570910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        // helper masks for common choices
1580910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        kMatrixClip_SaveFlag        = 0x03,
1590910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        kARGB_NoClipLayer_SaveFlag  = 0x0F,
1600910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        kARGB_ClipLayer_SaveFlag    = 0x1F
1610910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    };
1620910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1638f7d36c67f1bdde7ca1680857936f6af951e19e2Mike Reed    /** This call saves the current matrix, clip, and drawFilter, and pushes a
1640910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        copy onto a private stack. Subsequent calls to translate, scale,
1658f7d36c67f1bdde7ca1680857936f6af951e19e2Mike Reed        rotate, skew, concat or clipRect, clipPath, and setDrawFilter all
1668f7d36c67f1bdde7ca1680857936f6af951e19e2Mike Reed        operate on this copy.
1678f7d36c67f1bdde7ca1680857936f6af951e19e2Mike Reed        When the balancing call to restore() is made, the previous matrix, clip,
1688f7d36c67f1bdde7ca1680857936f6af951e19e2Mike Reed        and drawFilter are restored.
1690910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @return The value to pass to restoreToCount() to balance this save()
1700910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    */
1710910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    virtual int save(SaveFlags flags = kMatrixClip_SaveFlag);
1720910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1730910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    /** This behaves the same as save(), but in addition it allocates an
1740910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        offscreen bitmap. All drawing calls are directed there, and only when
1750910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        the balancing call to restore() is made is that offscreen transfered to
1768f7d36c67f1bdde7ca1680857936f6af951e19e2Mike Reed        the canvas (or the previous layer).
17740528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger        @param bounds (may be null) This rect, if non-null, is used as a hint to
17840528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger                      limit the size of the offscreen, and thus drawing may be
17940528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger                      clipped to it, though that clipping is not guaranteed to
18040528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger                      happen. If exact clipping is desired, use clipRect().
1810910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param paint (may be null) This is copied, and is applied to the
1820910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                     offscreen when restore() is called
1830910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param flags  LayerFlags
1840910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @return The value to pass to restoreToCount() to balance this save()
1850910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    */
1860910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    virtual int saveLayer(const SkRect* bounds, const SkPaint* paint,
1870910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                          SaveFlags flags = kARGB_ClipLayer_SaveFlag);
1880910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1890910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    /** This behaves the same as save(), but in addition it allocates an
1900910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        offscreen bitmap. All drawing calls are directed there, and only when
1910910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        the balancing call to restore() is made is that offscreen transfered to
1928f7d36c67f1bdde7ca1680857936f6af951e19e2Mike Reed        the canvas (or the previous layer).
19340528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger        @param bounds (may be null) This rect, if non-null, is used as a hint to
19440528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger                      limit the size of the offscreen, and thus drawing may be
19540528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger                      clipped to it, though that clipping is not guaranteed to
19640528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger                      happen. If exact clipping is desired, use clipRect().
1970910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param alpha  This is applied to the offscreen when restore() is called.
1980910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param flags  LayerFlags
1990910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @return The value to pass to restoreToCount() to balance this save()
2000910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    */
2010910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    int saveLayerAlpha(const SkRect* bounds, U8CPU alpha,
2020910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                       SaveFlags flags = kARGB_ClipLayer_SaveFlag);
2030910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
2040910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    /** This call balances a previous call to save(), and is used to remove all
2058f7d36c67f1bdde7ca1680857936f6af951e19e2Mike Reed        modifications to the matrix/clip/drawFilter state since the last save
2068f7d36c67f1bdde7ca1680857936f6af951e19e2Mike Reed        call.
2078f7d36c67f1bdde7ca1680857936f6af951e19e2Mike Reed        It is an error to call restore() more times than save() was called.
2080910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    */
2090910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    virtual void restore();
2100910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
2110910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    /** Returns the number of matrix/clip states on the SkCanvas' private stack.
2120910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        This will equal # save() calls - # restore() calls.
2130910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    */
2140910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    int getSaveCount() const;
2150910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
2160910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    /** Efficient way to pop any calls to save() that happened after the save
2170910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        count reached saveCount. It is an error for saveCount to be less than
2180910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        getSaveCount()
2190910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param saveCount    The number of save() levels to restore from
2200910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    */
2210910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    void restoreToCount(int saveCount);
2220910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
2230910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    /** Preconcat the current matrix with the specified translation
2240910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param dx   The distance to translate in X
2250910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param dy   The distance to translate in Y
2260910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        returns true if the operation succeeded (e.g. did not overflow)
2270910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    */
2280910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    virtual bool translate(SkScalar dx, SkScalar dy);
2290910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
2300910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    /** Preconcat the current matrix with the specified scale.
2310910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param sx   The amount to scale in X
2320910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param sy   The amount to scale in Y
2330910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        returns true if the operation succeeded (e.g. did not overflow)
2340910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    */
2350910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    virtual bool scale(SkScalar sx, SkScalar sy);
2360910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
2370910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    /** Preconcat the current matrix with the specified rotation.
2380910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param degrees  The amount to rotate, in degrees
2390910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        returns true if the operation succeeded (e.g. did not overflow)
2400910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    */
2410910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    virtual bool rotate(SkScalar degrees);
2420910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
2430910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    /** Preconcat the current matrix with the specified skew.
2440910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param sx   The amount to skew in X
2450910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param sy   The amount to skew in Y
2460910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        returns true if the operation succeeded (e.g. did not overflow)
2470910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    */
2480910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    virtual bool skew(SkScalar sx, SkScalar sy);
2490910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
2500910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    /** Preconcat the current matrix with the specified matrix.
2510910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param matrix   The matrix to preconcatenate with the current matrix
2520910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @return true if the operation succeeded (e.g. did not overflow)
2530910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    */
2540910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    virtual bool concat(const SkMatrix& matrix);
25540528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger
2560910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    /** Replace the current matrix with a copy of the specified matrix.
2570910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param matrix The matrix that will be copied into the current matrix.
2580910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    */
2590910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    virtual void setMatrix(const SkMatrix& matrix);
26040528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger
2610910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    /** Helper for setMatrix(identity). Sets the current matrix to identity.
2620910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    */
2630910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    void resetMatrix();
2640910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
2650910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    /** Modify the current clip with the specified rectangle.
2660910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param rect The rect to intersect with the current clip
2670910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param op The region op to apply to the current clip
2680910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @return true if the canvas' clip is non-empty
2690910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    */
2700910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    virtual bool clipRect(const SkRect& rect,
2710910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                          SkRegion::Op op = SkRegion::kIntersect_Op);
2720910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
2730910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    /** Modify the current clip with the specified path.
2740910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param path The path to apply to the current clip
2750910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param op The region op to apply to the current clip
2760910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @return true if the canvas' new clip is non-empty
2770910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    */
2780910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    virtual bool clipPath(const SkPath& path,
2790910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                          SkRegion::Op op = SkRegion::kIntersect_Op);
2800910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
2810910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    /** Modify the current clip with the specified region. Note that unlike
2820910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        clipRect() and clipPath() which transform their arguments by the current
2830910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        matrix, clipRegion() assumes its argument is already in device
2840910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        coordinates, and so no transformation is performed.
2850910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param deviceRgn    The region to apply to the current clip
2860910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param op The region op to apply to the current clip
2870910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @return true if the canvas' new clip is non-empty
2880910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    */
2890910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    virtual bool clipRegion(const SkRegion& deviceRgn,
2900910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                            SkRegion::Op op = SkRegion::kIntersect_Op);
2910910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
2920910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    /** Helper for clipRegion(rgn, kReplace_Op). Sets the current clip to the
2930910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        specified region. This does not intersect or in any other way account
2940910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        for the existing clip region.
2950910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param deviceRgn The region to copy into the current clip.
2960910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @return true if the new clip region is non-empty
2970910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    */
2980910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    bool setClipRegion(const SkRegion& deviceRgn) {
2990910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        return this->clipRegion(deviceRgn, SkRegion::kReplace_Op);
3000910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    }
3010910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
3020910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    /** Enum describing how to treat edges when performing quick-reject tests
3030910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        of a geometry against the current clip. Treating them as antialiased
3040910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        (kAA_EdgeType) will take into account the extra pixels that may be drawn
3050910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        if the edge does not lie exactly on a device pixel boundary (after being
3060910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        transformed by the current matrix).
3070910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    */
3080910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    enum EdgeType {
3090910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        /** Treat the edges as B&W (not antialiased) for the purposes of testing
3100910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            against the current clip
3110910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        */
3120910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        kBW_EdgeType,
3130910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        /** Treat the edges as antialiased for the purposes of testing
3140910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            against the current clip
3150910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        */
3160910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        kAA_EdgeType
3170910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    };
3180910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
3190910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    /** Return true if the specified rectangle, after being transformed by the
3200910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        current matrix, would lie completely outside of the current clip. Call
3210910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        this to check if an area you intend to draw into is clipped out (and
3220910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        therefore you can skip making the draw calls).
3230910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param rect the rect to compare with the current clip
3240910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param et  specifies how to treat the edges (see EdgeType)
3250910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @return true if the rect (transformed by the canvas' matrix) does not
3260910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                     intersect with the canvas' clip
3270910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    */
3280910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    bool quickReject(const SkRect& rect, EdgeType et) const;
3290910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
3300910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    /** Return true if the specified path, after being transformed by the
3310910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        current matrix, would lie completely outside of the current clip. Call
3320910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        this to check if an area you intend to draw into is clipped out (and
3330910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        therefore you can skip making the draw calls). Note, for speed it may
3340910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        return false even if the path itself might not intersect the clip
3350910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        (i.e. the bounds of the path intersects, but the path does not).
3360910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param path The path to compare with the current clip
3370910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param et  specifies how to treat the edges (see EdgeType)
3380910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @return true if the path (transformed by the canvas' matrix) does not
3390910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                     intersect with the canvas' clip
3400910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    */
3410910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    bool quickReject(const SkPath& path, EdgeType et) const;
3420910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
3430910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    /** Return true if the horizontal band specified by top and bottom is
3440910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        completely clipped out. This is a conservative calculation, meaning
3450910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        that it is possible that if the method returns false, the band may still
3460910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        in fact be clipped out, but the converse is not true. If this method
3470910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        returns true, then the band is guaranteed to be clipped out.
3480910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param top  The top of the horizontal band to compare with the clip
3490910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param bottom The bottom of the horizontal and to compare with the clip
3500910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @return true if the horizontal band is completely clipped out (i.e. does
3510910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                     not intersect the current clip)
3520910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    */
3530910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    bool quickRejectY(SkScalar top, SkScalar bottom, EdgeType et) const;
3540910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
3550910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    /** Return the bounds of the current clip (in local coordinates) in the
3560910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        bounds parameter, and return true if it is non-empty. This can be useful
3570910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        in a way similar to quickReject, in that it tells you that drawing
3580910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        outside of these bounds will be clipped out.
3590910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    */
3600910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    bool getClipBounds(SkRect* bounds, EdgeType et = kAA_EdgeType) const;
3610910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
3620910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    /** Fill the entire canvas' bitmap (restricted to the current clip) with the
36359f59bde0b05a6ac5ff28fdebc1942dbf0d43aabMike Reed        specified ARGB color, using the specified mode.
3640910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param a    the alpha component (0..255) of the color to fill the canvas
3650910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param r    the red component (0..255) of the color to fill the canvas
3660910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param g    the green component (0..255) of the color to fill the canvas
3670910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param b    the blue component (0..255) of the color to fill the canvas
3680910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param mode the mode to apply the color in (defaults to SrcOver)
3690910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    */
3700910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    void drawARGB(U8CPU a, U8CPU r, U8CPU g, U8CPU b,
37159f59bde0b05a6ac5ff28fdebc1942dbf0d43aabMike Reed                  SkXfermode::Mode mode = SkXfermode::kSrcOver_Mode);
3720910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
3730910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    /** Fill the entire canvas' bitmap (restricted to the current clip) with the
37459f59bde0b05a6ac5ff28fdebc1942dbf0d43aabMike Reed        specified color and mode.
3750910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param color    the color to draw with
3760910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param mode the mode to apply the color in (defaults to SrcOver)
3770910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    */
3780910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    void drawColor(SkColor color,
37959f59bde0b05a6ac5ff28fdebc1942dbf0d43aabMike Reed                   SkXfermode::Mode mode = SkXfermode::kSrcOver_Mode);
3800910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
38135e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger    /**
38235e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger     *  This erases the entire drawing surface to the specified color,
38335e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger     *  irrespective of the clip. It does not blend with the previous pixels,
38435e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger     *  but always overwrites them.
38535e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger     *
38635e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger     *  It is roughly equivalent to the following:
38735e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger     *      canvas.save();
38835e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger     *      canvas.clipRect(hugeRect, kReplace_Op);
38935e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger     *      paint.setColor(color);
39035e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger     *      paint.setXfermodeMode(kSrc_Mode);
39135e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger     *      canvas.drawPaint(paint);
39235e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger     *      canvas.restore();
39335e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger     *  though it is almost always much more efficient.
39435e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger     */
39535e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger    virtual void clear(SkColor);
39635e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger
39735e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger    /**
39835e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger     *  Fill the entire canvas' bitmap (restricted to the current clip) with the
39935e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger     *  specified paint.
40035e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger     *  @param paint    The paint used to fill the canvas
40135e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger     */
4020910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    virtual void drawPaint(const SkPaint& paint);
4030910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
4040910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    enum PointMode {
4050910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        /** drawPoints draws each point separately */
4060910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        kPoints_PointMode,
4070910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        /** drawPoints draws each pair of points as a line segment */
4080910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        kLines_PointMode,
4090910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        /** drawPoints draws the array of points as a polygon */
4100910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        kPolygon_PointMode
4110910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    };
4120910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
4130910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    /** Draw a series of points, interpreted based on the PointMode mode. For
4140910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        all modes, the count parameter is interpreted as the total number of
4150910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        points. For kLine mode, count/2 line segments are drawn.
4160910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        For kPoint mode, each point is drawn centered at its coordinate, and its
4170910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        size is specified by the paint's stroke-width. It draws as a square,
4180910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        unless the paint's cap-type is round, in which the points are drawn as
4190910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        circles.
4200910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        For kLine mode, each pair of points is drawn as a line segment,
4210910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        respecting the paint's settings for cap/join/width.
4220910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        For kPolygon mode, the entire array is drawn as a series of connected
4230910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        line segments.
4240910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        Note that, while similar, kLine and kPolygon modes draw slightly
4250910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        differently than the equivalent path built with a series of moveto,
4260910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        lineto calls, in that the path will draw all of its contours at once,
4270910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        with no interactions if contours intersect each other (think XOR
4280910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        xfermode). drawPoints always draws each element one at a time.
4290910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param mode     PointMode specifying how to draw the array of points.
4300910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param count    The number of points in the array
4310910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param pts      Array of points to draw
4320910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param paint    The paint used to draw the points
4330910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    */
4340910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    virtual void drawPoints(PointMode mode, size_t count, const SkPoint pts[],
4350910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                            const SkPaint& paint);
4360910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
4370910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    /** Helper method for drawing a single point. See drawPoints() for a more
4380910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        details.
4390910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    */
4400910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    void drawPoint(SkScalar x, SkScalar y, const SkPaint& paint);
44140528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger
4420910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    /** Draws a single pixel in the specified color.
4430910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param x        The X coordinate of which pixel to draw
4440910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param y        The Y coordiante of which pixel to draw
4450910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param color    The color to draw
4460910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    */
4470910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    void drawPoint(SkScalar x, SkScalar y, SkColor color);
4480910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
4490910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    /** Draw a line segment with the specified start and stop x,y coordinates,
4500910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        using the specified paint. NOTE: since a line is always "framed", the
4510910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        paint's Style is ignored.
4520910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param x0    The x-coordinate of the start point of the line
4530910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param y0    The y-coordinate of the start point of the line
4540910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param x1    The x-coordinate of the end point of the line
4550910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param y1    The y-coordinate of the end point of the line
4560910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param paint The paint used to draw the line
4570910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    */
4580910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    void drawLine(SkScalar x0, SkScalar y0, SkScalar x1, SkScalar y1,
4590910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                  const SkPaint& paint);
4600910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
4610910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    /** Draw the specified rectangle using the specified paint. The rectangle
4620910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        will be filled or stroked based on the Style in the paint.
4630910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param rect     The rect to be drawn
4640910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param paint    The paint used to draw the rect
4650910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    */
4660910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    virtual void drawRect(const SkRect& rect, const SkPaint& paint);
4670910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
4680910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    /** Draw the specified rectangle using the specified paint. The rectangle
4690910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        will be filled or framed based on the Style in the paint.
4700910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param rect     The rect to be drawn
4710910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param paint    The paint used to draw the rect
4720910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    */
4730910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    void drawIRect(const SkIRect& rect, const SkPaint& paint)
4740910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    {
4750910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        SkRect r;
4760910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        r.set(rect);    // promotes the ints to scalars
4770910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        this->drawRect(r, paint);
4780910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    }
47940528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger
4800910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    /** Draw the specified rectangle using the specified paint. The rectangle
4810910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        will be filled or framed based on the Style in the paint.
4820910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param left     The left side of the rectangle to be drawn
4830910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param top      The top side of the rectangle to be drawn
4840910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param right    The right side of the rectangle to be drawn
4850910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param bottom   The bottom side of the rectangle to be drawn
4860910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param paint    The paint used to draw the rect
4870910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    */
4880910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    void drawRectCoords(SkScalar left, SkScalar top, SkScalar right,
4890910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                        SkScalar bottom, const SkPaint& paint);
4900910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
4910910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    /** Draw the specified oval using the specified paint. The oval will be
4920910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        filled or framed based on the Style in the paint.
4930910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param oval     The rectangle bounds of the oval to be drawn
4940910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param paint    The paint used to draw the oval
4950910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    */
4960910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    void drawOval(const SkRect& oval, const SkPaint&);
4970910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
4980910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    /** Draw the specified circle using the specified paint. If radius is <= 0,
4990910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        then nothing will be drawn. The circle will be filled
5000910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        or framed based on the Style in the paint.
5010910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param cx       The x-coordinate of the center of the cirle to be drawn
5020910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param cy       The y-coordinate of the center of the cirle to be drawn
5030910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param radius   The radius of the cirle to be drawn
5040910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param paint    The paint used to draw the circle
5050910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    */
5060910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    void drawCircle(SkScalar cx, SkScalar cy, SkScalar radius,
5070910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                    const SkPaint& paint);
5080910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
5090910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    /** Draw the specified arc, which will be scaled to fit inside the
5100910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        specified oval. If the sweep angle is >= 360, then the oval is drawn
5110910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        completely. Note that this differs slightly from SkPath::arcTo, which
5120910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        treats the sweep angle mod 360.
5130910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param oval The bounds of oval used to define the shape of the arc
5140910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param startAngle Starting angle (in degrees) where the arc begins
5150910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param sweepAngle Sweep angle (in degrees) measured clockwise
5160910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param useCenter true means include the center of the oval. For filling
5170910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                         this will draw a wedge. False means just use the arc.
5180910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param paint    The paint used to draw the arc
5190910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    */
5200910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    void drawArc(const SkRect& oval, SkScalar startAngle, SkScalar sweepAngle,
5210910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                 bool useCenter, const SkPaint& paint);
5220910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
5230910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    /** Draw the specified round-rect using the specified paint. The round-rect
5240910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        will be filled or framed based on the Style in the paint.
5250910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param rect     The rectangular bounds of the roundRect to be drawn
5260910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param rx       The x-radius of the oval used to round the corners
5270910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param ry       The y-radius of the oval used to round the corners
5280910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param paint    The paint used to draw the roundRect
5290910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    */
5300910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    void drawRoundRect(const SkRect& rect, SkScalar rx, SkScalar ry,
5310910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                       const SkPaint& paint);
5320910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
5330910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    /** Draw the specified path using the specified paint. The path will be
5340910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        filled or framed based on the Style in the paint.
5350910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param path     The path to be drawn
5360910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param paint    The paint used to draw the path
5370910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    */
5380910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    virtual void drawPath(const SkPath& path, const SkPaint& paint);
5390910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
5400910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    /** Draw the specified bitmap, with its top/left corner at (x,y), using the
5410910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        specified paint, transformed by the current matrix. Note: if the paint
5420910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        contains a maskfilter that generates a mask which extends beyond the
5430910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        bitmap's original width/height, then the bitmap will be drawn as if it
5440910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        were in a Shader with CLAMP mode. Thus the color outside of the original
5450910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        width/height will be the edge color replicated.
5460910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param bitmap   The bitmap to be drawn
5470910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param left     The position of the left side of the bitmap being drawn
5480910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param top      The position of the top side of the bitmap being drawn
5490910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param paint    The paint used to draw the bitmap, or NULL
5500910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    */
5510910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    virtual void drawBitmap(const SkBitmap& bitmap, SkScalar left, SkScalar top,
5520910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                            const SkPaint* paint = NULL);
5530910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
5540910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    /** Draw the specified bitmap, with the specified matrix applied (before the
5550910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        canvas' matrix is applied).
5560910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param bitmap   The bitmap to be drawn
5570910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param src      Optional: specify the subset of the bitmap to be drawn
5580910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param dst      The destination rectangle where the scaled/translated
5590910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                        image will be drawn
5600910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param paint    The paint used to draw the bitmap, or NULL
5610910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    */
5620910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    virtual void drawBitmapRect(const SkBitmap& bitmap, const SkIRect* src,
5630910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                                const SkRect& dst, const SkPaint* paint = NULL);
5640910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
5650910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    virtual void drawBitmapMatrix(const SkBitmap& bitmap, const SkMatrix& m,
5660910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                                  const SkPaint* paint = NULL);
56740528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger
5680910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    /** Draw the specified bitmap, with its top/left corner at (x,y),
5690910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        NOT transformed by the current matrix. Note: if the paint
5700910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        contains a maskfilter that generates a mask which extends beyond the
5710910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        bitmap's original width/height, then the bitmap will be drawn as if it
5720910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        were in a Shader with CLAMP mode. Thus the color outside of the original
5730910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        width/height will be the edge color replicated.
5740910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param bitmap   The bitmap to be drawn
5750910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param left     The position of the left side of the bitmap being drawn
5760910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param top      The position of the top side of the bitmap being drawn
5770910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param paint    The paint used to draw the bitmap, or NULL
5780910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    */
5790910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    virtual void drawSprite(const SkBitmap& bitmap, int left, int top,
5800910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                            const SkPaint* paint = NULL);
5810910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
5820910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    /** Draw the text, with origin at (x,y), using the specified paint.
5830910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        The origin is interpreted based on the Align setting in the paint.
5840910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param text The text to be drawn
5850910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param byteLength   The number of bytes to read from the text parameter
5860910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param x        The x-coordinate of the origin of the text being drawn
5870910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param y        The y-coordinate of the origin of the text being drawn
5880910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param paint    The paint used for the text (e.g. color, size, style)
5890910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    */
5900910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    virtual void drawText(const void* text, size_t byteLength, SkScalar x,
5910910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                          SkScalar y, const SkPaint& paint);
5920910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
5930910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    /** Draw the text, with each character/glyph origin specified by the pos[]
59440528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger        array. The origin is interpreted by the Align setting in the paint.
5950910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param text The text to be drawn
5960910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param byteLength   The number of bytes to read from the text parameter
5970910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param pos      Array of positions, used to position each character
5980910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param paint    The paint used for the text (e.g. color, size, style)
5990910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        */
6000910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    virtual void drawPosText(const void* text, size_t byteLength,
6010910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                             const SkPoint pos[], const SkPaint& paint);
60240528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger
6030910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    /** Draw the text, with each character/glyph origin specified by the x
6040910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        coordinate taken from the xpos[] array, and the y from the constY param.
60540528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger        The origin is interpreted by the Align setting in the paint.
6060910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param text The text to be drawn
6070910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param byteLength   The number of bytes to read from the text parameter
6080910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param xpos     Array of x-positions, used to position each character
6090910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param constY   The shared Y coordinate for all of the positions
6100910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param paint    The paint used for the text (e.g. color, size, style)
6110910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        */
6120910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    virtual void drawPosTextH(const void* text, size_t byteLength,
6130910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                              const SkScalar xpos[], SkScalar constY,
6140910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                              const SkPaint& paint);
61540528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger
6160910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    /** Draw the text, with origin at (x,y), using the specified paint, along
6170910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        the specified path. The paint's Align setting determins where along the
6180910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        path to start the text.
6190910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param text The text to be drawn
6200910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param byteLength   The number of bytes to read from the text parameter
6210910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param path         The path the text should follow for its baseline
6220910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param hOffset      The distance along the path to add to the text's
6230910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                            starting position
6240910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param vOffset      The distance above(-) or below(+) the path to
6250910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                            position the text
6260910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param paint        The paint used for the text
6270910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    */
6280910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    void drawTextOnPathHV(const void* text, size_t byteLength,
6290910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                          const SkPath& path, SkScalar hOffset,
6300910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                          SkScalar vOffset, const SkPaint& paint);
6310910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
6320910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    /** Draw the text, with origin at (x,y), using the specified paint, along
6330910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        the specified path. The paint's Align setting determins where along the
6340910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        path to start the text.
6350910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param text The text to be drawn
6360910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param byteLength   The number of bytes to read from the text parameter
6370910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param path         The path the text should follow for its baseline
6380910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param matrix       (may be null) Applied to the text before it is
6390910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                            mapped onto the path
6400910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param paint        The paint used for the text
6410910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        */
6420910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    virtual void drawTextOnPath(const void* text, size_t byteLength,
6430910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                                const SkPath& path, const SkMatrix* matrix,
6440910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                                const SkPaint& paint);
6450910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
64605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger#ifdef ANDROID
647a2dfb00239c367c3663e8487a8213d0edad238baAndreas Borglin    /** Draw the text on path, with each character/glyph origin specified by the pos[]
648a2dfb00239c367c3663e8487a8213d0edad238baAndreas Borglin        array. The origin is interpreted by the Align setting in the paint.
649a2dfb00239c367c3663e8487a8213d0edad238baAndreas Borglin        @param text The text to be drawn
650a2dfb00239c367c3663e8487a8213d0edad238baAndreas Borglin        @param byteLength   The number of bytes to read from the text parameter
651a2dfb00239c367c3663e8487a8213d0edad238baAndreas Borglin        @param pos      Array of positions, used to position each character
652a2dfb00239c367c3663e8487a8213d0edad238baAndreas Borglin        @param paint    The paint used for the text (e.g. color, size, style)
653a2dfb00239c367c3663e8487a8213d0edad238baAndreas Borglin        @param path The path to draw on
654a2dfb00239c367c3663e8487a8213d0edad238baAndreas Borglin        @param matrix The canvas matrix
655a2dfb00239c367c3663e8487a8213d0edad238baAndreas Borglin        */
656a2dfb00239c367c3663e8487a8213d0edad238baAndreas Borglin    void drawPosTextOnPath(const void* text, size_t byteLength,
657a2dfb00239c367c3663e8487a8213d0edad238baAndreas Borglin                           const SkPoint pos[], const SkPaint& paint,
658a2dfb00239c367c3663e8487a8213d0edad238baAndreas Borglin                           const SkPath& path, const SkMatrix* matrix);
65905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger#endif
660a2dfb00239c367c3663e8487a8213d0edad238baAndreas Borglin
6610910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    /** Draw the picture into this canvas. This method effective brackets the
6620910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        playback of the picture's draw calls with save/restore, so the state
6630910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        of this canvas will be unchanged after this call. This contrasts with
6640910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        the more immediate method SkPicture::draw(), which does not bracket
6650910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        the canvas with save/restore, thus the canvas may be left in a changed
6660910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        state after the call.
6670910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param picture The recorded drawing commands to playback into this
6680910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                       canvas.
6690910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    */
6700910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    virtual void drawPicture(SkPicture& picture);
67140528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger
672dab163f0b2658c2dba48839e72f81d3d8ee0ae8bMike Reed    /** Draws the specified shape
673dab163f0b2658c2dba48839e72f81d3d8ee0ae8bMike Reed     */
674dab163f0b2658c2dba48839e72f81d3d8ee0ae8bMike Reed    virtual void drawShape(SkShape*);
675dab163f0b2658c2dba48839e72f81d3d8ee0ae8bMike Reed
6760910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    enum VertexMode {
6770910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        kTriangles_VertexMode,
6780910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        kTriangleStrip_VertexMode,
6790910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        kTriangleFan_VertexMode
6800910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    };
68140528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger
6820910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    /** Draw the array of vertices, interpreted as triangles (based on mode).
6830910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param vmode How to interpret the array of vertices
6840910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param vertexCount The number of points in the vertices array (and
6850910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                    corresponding texs and colors arrays if non-null)
6860910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param vertices Array of vertices for the mesh
6870910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param texs May be null. If not null, specifies the coordinate
6880910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                             in texture space for each vertex.
6890910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param colors May be null. If not null, specifies a color for each
6900910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                      vertex, to be interpolated across the triangle.
6910910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param xmode Used if both texs and colors are present. In this
6920910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                    case the colors are combined with the texture using mode,
6930910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                    before being drawn using the paint. If mode is null, then
69459f59bde0b05a6ac5ff28fdebc1942dbf0d43aabMike Reed                    kMultiply_Mode is used.
6950910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param indices If not null, array of indices to reference into the
6960910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                    vertex (texs, colors) array.
6970910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param indexCount number of entries in the indices array (if not null)
69840528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger        @param paint Specifies the shader/texture if present.
6990910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    */
7000910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    virtual void drawVertices(VertexMode vmode, int vertexCount,
7010910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                              const SkPoint vertices[], const SkPoint texs[],
7020910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                              const SkColor colors[], SkXfermode* xmode,
7030910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                              const uint16_t indices[], int indexCount,
7040910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                              const SkPaint& paint);
7050910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
70693d11b5b461a8677a8e3ffa94260f4f9897070acMike Reed    /** Send a blob of data to the canvas.
70793d11b5b461a8677a8e3ffa94260f4f9897070acMike Reed        For canvases that draw, this call is effectively a no-op, as the data
70893d11b5b461a8677a8e3ffa94260f4f9897070acMike Reed        is not parsed, but just ignored. However, this call exists for
70993d11b5b461a8677a8e3ffa94260f4f9897070acMike Reed        subclasses like SkPicture's recording canvas, that can store the data
71093d11b5b461a8677a8e3ffa94260f4f9897070acMike Reed        and then play it back later (via another call to drawData).
71193d11b5b461a8677a8e3ffa94260f4f9897070acMike Reed     */
71293d11b5b461a8677a8e3ffa94260f4f9897070acMike Reed    virtual void drawData(const void* data, size_t length);
71393d11b5b461a8677a8e3ffa94260f4f9897070acMike Reed
7140910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    //////////////////////////////////////////////////////////////////////////
71540528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger
7160910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    /** Get the current bounder object.
7170910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        The bounder's reference count is unchaged.
7180910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @return the canva's bounder (or NULL).
7190910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    */
7200910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkBounder*  getBounder() const { return fBounder; }
7210910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
7220910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    /** Set a new bounder (or NULL).
7230910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        Pass NULL to clear any previous bounder.
7240910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        As a convenience, the parameter passed is also returned.
7250910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        If a previous bounder exists, its reference count is decremented.
7260910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        If bounder is not NULL, its reference count is incremented.
7270910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param bounder the new bounder (or NULL) to be installed in the canvas
7280910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @return the set bounder object
7290910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    */
7300910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    virtual SkBounder* setBounder(SkBounder* bounder);
73140528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger
7320910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    /** Get the current filter object. The filter's reference count is not
7338f7d36c67f1bdde7ca1680857936f6af951e19e2Mike Reed        affected. The filter is saved/restored, just like the matrix and clip.
7340910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @return the canvas' filter (or NULL).
7350910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    */
7360910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkDrawFilter* getDrawFilter() const;
73740528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger
7380910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    /** Set the new filter (or NULL). Pass NULL to clear any existing filter.
7390910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        As a convenience, the parameter is returned. If an existing filter
7400910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        exists, its refcnt is decrement. If the new filter is not null, its
7418f7d36c67f1bdde7ca1680857936f6af951e19e2Mike Reed        refcnt is incremented. The filter is saved/restored, just like the
7428f7d36c67f1bdde7ca1680857936f6af951e19e2Mike Reed        matrix and clip.
7430910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param filter the new filter (or NULL)
7440910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @return the new filter
7450910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    */
7460910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    virtual SkDrawFilter* setDrawFilter(SkDrawFilter* filter);
7470910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
7480910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    //////////////////////////////////////////////////////////////////////////
7490910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
7500910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    /** Return the current matrix on the canvas.
7510910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        This does not account for the translate in any of the devices.
7520910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @return The current matrix on the canvas.
7530910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    */
7540910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    const SkMatrix& getTotalMatrix() const;
7550910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
7560910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    /** Return the current device clip (concatenation of all clip calls).
7570910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        This does not account for the translate in any of the devices.
7580910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @return the current device clip (concatenation of all clip calls).
7590910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    */
7600910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    const SkRegion& getTotalClip() const;
7610910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
76205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    /**
76305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger     *  Return the current clipstack. This mirrors the result in getTotalClip()
76405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger     *  but is represented as a stack of geometric clips + region-ops.
76505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger     */
76605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    const SkClipStack& getTotalClipStack() const;
76705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
76840528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger    void setExternalMatrix(const SkMatrix* = NULL);
7690910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
7700910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    ///////////////////////////////////////////////////////////////////////////
7710910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
7720910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    /** After calling saveLayer(), there can be any number of devices that make
7730910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        up the top-most drawing area. LayerIter can be used to iterate through
7740910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        those devices. Note that the iterator is only valid until the next API
7750910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        call made on the canvas. Ownership of all pointers in the iterator stays
7760910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        with the canvas, so none of them should be modified or deleted.
7770910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    */
778137a4ca42423bbb6d683067ea544c9a48f18f06cDerek Sollenberger    class SK_API LayerIter /*: SkNoncopyable*/ {
7790910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    public:
7800910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        /** Initialize iterator with canvas, and set values for 1st device */
7810910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        LayerIter(SkCanvas*, bool skipEmptyClips);
7820910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        ~LayerIter();
78340528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger
7840910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        /** Return true if the iterator is done */
7850910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        bool done() const { return fDone; }
7860910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        /** Cycle to the next device */
7870910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        void next();
78840528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger
7890910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        // These reflect the current device in the iterator
7900910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
7910910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        SkDevice*       device() const;
7920910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        const SkMatrix& matrix() const;
7930910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        const SkRegion& clip() const;
7940910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        const SkPaint&  paint() const;
7950910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        int             x() const;
7960910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        int             y() const;
79740528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger
7980910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    private:
7990910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        // used to embed the SkDrawIter object directly in our instance, w/o
8000910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        // having to expose that class def to the public. There is an assert
8010910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        // in our constructor to ensure that fStorage is large enough
8020910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        // (though needs to be a compile-time-assert!). We use intptr_t to work
8030910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        // safely with 32 and 64 bit machines (to ensure the storage is enough)
80440528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger        intptr_t          fStorage[32];
8050910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        class SkDrawIter* fImpl;    // this points at fStorage
8060910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        SkPaint           fDefaultPaint;
8070910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        bool              fDone;
8080910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    };
8090910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
8100910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectprotected:
8110910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    // all of the drawBitmap variants call this guy
81240528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger    virtual void commonDrawBitmap(const SkBitmap&, const SkIRect*,
81340528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger                                  const SkMatrix&, const SkPaint& paint);
81440528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger
8150910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectprivate:
8160910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    class MCRec;
8170910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
81871531ca1f484da5837be8017a0c83e5bff701587Derek Sollenberger    SkClipStack fClipStack;
8190910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkDeque     fMCStack;
8200910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    // points to top of stack
8210910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    MCRec*      fMCRec;
8220910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    // the first N recs that can fit here mean we won't call malloc
8230910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    uint32_t    fMCRecStorage[32];
8240910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
8250910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkBounder*  fBounder;
826f87ea139deed57504b433fc4e1bf98c85ef0da80Mike Reed    SkDevice*   fLastDeviceToGainFocus;
82720ab88413000fcc8668eeab25d9cb714097d0c45tedbo    SkDeviceFactory* fDeviceFactory;
8280910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
82905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    void prepareForDeviceDraw(SkDevice*, const SkMatrix&, const SkRegion&,
83005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger                              const SkClipStack& clipStack);
83140528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger
8320910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    bool fDeviceCMDirty;            // cleared by updateDeviceCMCache()
8330910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    void updateDeviceCMCache();
8340910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
8350910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    friend class SkDrawIter;    // needs setupDrawForLayerDevice()
8360910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
8370910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkDevice* init(SkDevice*);
83840528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger    void internalDrawBitmap(const SkBitmap&, const SkIRect*, const SkMatrix& m,
8390910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                                  const SkPaint* paint);
8400910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    void drawDevice(SkDevice*, int x, int y, const SkPaint*);
8410910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    // shared by save() and saveLayer()
8420910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    int internalSave(SaveFlags flags);
8430910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    void internalRestore();
84440528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger
8450910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    /*  These maintain a cache of the clip bounds in local coordinates,
8460910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        (converted to 2s-compliment if floats are slow).
8470910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project     */
8480910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    mutable SkRectCompareType fLocalBoundsCompareType;
8490910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    mutable bool              fLocalBoundsCompareTypeDirty;
8500910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
85143356962b0685a89e232a038b2b33162da04517dRomain Guy    mutable SkRectCompareType fLocalBoundsCompareTypeBW;
85243356962b0685a89e232a038b2b33162da04517dRomain Guy    mutable bool              fLocalBoundsCompareTypeDirtyBW;
85343356962b0685a89e232a038b2b33162da04517dRomain Guy
85443356962b0685a89e232a038b2b33162da04517dRomain Guy    /* Get the local clip bounds with an anti-aliased edge.
85543356962b0685a89e232a038b2b33162da04517dRomain Guy     */
8560910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    const SkRectCompareType& getLocalClipBoundsCompareType() const {
85743356962b0685a89e232a038b2b33162da04517dRomain Guy        return getLocalClipBoundsCompareType(kAA_EdgeType);
85843356962b0685a89e232a038b2b33162da04517dRomain Guy    }
85943356962b0685a89e232a038b2b33162da04517dRomain Guy
86043356962b0685a89e232a038b2b33162da04517dRomain Guy    const SkRectCompareType& getLocalClipBoundsCompareType(EdgeType et) const {
86143356962b0685a89e232a038b2b33162da04517dRomain Guy        if (et == kAA_EdgeType) {
86243356962b0685a89e232a038b2b33162da04517dRomain Guy            if (fLocalBoundsCompareTypeDirty) {
86343356962b0685a89e232a038b2b33162da04517dRomain Guy                this->computeLocalClipBoundsCompareType(et);
86443356962b0685a89e232a038b2b33162da04517dRomain Guy                fLocalBoundsCompareTypeDirty = false;
86543356962b0685a89e232a038b2b33162da04517dRomain Guy            }
86643356962b0685a89e232a038b2b33162da04517dRomain Guy            return fLocalBoundsCompareType;
86743356962b0685a89e232a038b2b33162da04517dRomain Guy        } else {
86843356962b0685a89e232a038b2b33162da04517dRomain Guy            if (fLocalBoundsCompareTypeDirtyBW) {
86943356962b0685a89e232a038b2b33162da04517dRomain Guy                this->computeLocalClipBoundsCompareType(et);
87043356962b0685a89e232a038b2b33162da04517dRomain Guy                fLocalBoundsCompareTypeDirtyBW = false;
87143356962b0685a89e232a038b2b33162da04517dRomain Guy            }
87243356962b0685a89e232a038b2b33162da04517dRomain Guy            return fLocalBoundsCompareTypeBW;
8730910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        }
8740910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    }
87543356962b0685a89e232a038b2b33162da04517dRomain Guy    void computeLocalClipBoundsCompareType(EdgeType et) const;
87640528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger
87740528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger    SkMatrix    fExternalMatrix, fExternalInverse;
87840528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger    bool        fUseExternalMatrix;
87971531ca1f484da5837be8017a0c83e5bff701587Derek Sollenberger
88071531ca1f484da5837be8017a0c83e5bff701587Derek Sollenberger    class AutoValidateClip : ::SkNoncopyable {
88171531ca1f484da5837be8017a0c83e5bff701587Derek Sollenberger    public:
88271531ca1f484da5837be8017a0c83e5bff701587Derek Sollenberger        explicit AutoValidateClip(SkCanvas* canvas) : fCanvas(canvas) {
88371531ca1f484da5837be8017a0c83e5bff701587Derek Sollenberger            fCanvas->validateClip();
88471531ca1f484da5837be8017a0c83e5bff701587Derek Sollenberger        }
88571531ca1f484da5837be8017a0c83e5bff701587Derek Sollenberger        ~AutoValidateClip() { fCanvas->validateClip(); }
88671531ca1f484da5837be8017a0c83e5bff701587Derek Sollenberger
88771531ca1f484da5837be8017a0c83e5bff701587Derek Sollenberger    private:
88871531ca1f484da5837be8017a0c83e5bff701587Derek Sollenberger        const SkCanvas* fCanvas;
88971531ca1f484da5837be8017a0c83e5bff701587Derek Sollenberger    };
89071531ca1f484da5837be8017a0c83e5bff701587Derek Sollenberger
89171531ca1f484da5837be8017a0c83e5bff701587Derek Sollenberger#ifdef SK_DEBUG
89271531ca1f484da5837be8017a0c83e5bff701587Derek Sollenberger    void validateClip() const;
89371531ca1f484da5837be8017a0c83e5bff701587Derek Sollenberger#else
89471531ca1f484da5837be8017a0c83e5bff701587Derek Sollenberger    void validateClip() const {}
89571531ca1f484da5837be8017a0c83e5bff701587Derek Sollenberger#endif
8960910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project};
8970910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
8980910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project/** Stack helper class to automatically call restoreToCount() on the canvas
8990910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    when this object goes out of scope. Use this to guarantee that the canvas
9000910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    is restored to a known state.
9010910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project*/
9020910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectclass SkAutoCanvasRestore : SkNoncopyable {
9030910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectpublic:
9040910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkAutoCanvasRestore(SkCanvas* canvas, bool doSave) : fCanvas(canvas) {
9050910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        SkASSERT(canvas);
9060910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        fSaveCount = canvas->getSaveCount();
9070910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        if (doSave) {
9080910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            canvas->save();
9090910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        }
9100910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    }
9110910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    ~SkAutoCanvasRestore() {
9120910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        fCanvas->restoreToCount(fSaveCount);
9130910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    }
9140910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
9150910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectprivate:
9160910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkCanvas*   fCanvas;
9170910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    int         fSaveCount;
9180910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project};
9190910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
9200910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#endif
9210910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
922