11cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
20910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project/*
31cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * Copyright 2006 The Android Open Source Project
40910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project *
51cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * Use of this source code is governed by a BSD-style license that can be
61cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * found in the LICENSE file.
70910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project */
80910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
91cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
100910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#ifndef SkCanvas_DEFINED
110910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define SkCanvas_DEFINED
120910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
130910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkTypes.h"
140910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkBitmap.h"
150910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkDeque.h"
1671531ca1f484da5837be8017a0c83e5bff701587Derek Sollenberger#include "SkClipStack.h"
170910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkPaint.h"
180910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkRefCnt.h"
190910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkPath.h"
200910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkRegion.h"
210910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkScalarCompare.h"
2259f59bde0b05a6ac5ff28fdebc1942dbf0d43aabMike Reed#include "SkXfermode.h"
230910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
240910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectclass SkBounder;
250910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectclass SkDevice;
260910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectclass SkDraw;
270910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectclass SkDrawFilter;
280910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectclass SkPicture;
290910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
300910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project/** \class SkCanvas
310910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
320910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    A Canvas encapsulates all of the state about drawing into a device (bitmap).
330910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    This includes a reference to the device itself, and a stack of matrix/clip
340910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    values. For any given draw call (e.g. drawRect), the geometry of the object
350910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    being drawn is transformed by the concatenation of all the matrices in the
360910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    stack. The transformed geometry is clipped by the intersection of all of
370910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    the clips in the stack.
380910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
390910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    While the Canvas holds the state of the drawing device, the state (style)
400910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    of the object being drawn is held by the Paint, which is provided as a
410910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    parameter to each of the draw() methods. The Paint holds attributes such as
420910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    color, typeface, textSize, strokeWidth, shader (e.g. gradients, patterns),
430910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    etc.
440910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project*/
45137a4ca42423bbb6d683067ea544c9a48f18f06cDerek Sollenbergerclass SK_API SkCanvas : public SkRefCnt {
460910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectpublic:
471cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    SkCanvas();
481cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
491cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    /** Construct a canvas with the specified device to draw into.
5020ab88413000fcc8668eeab25d9cb714097d0c45tedbo
5120ab88413000fcc8668eeab25d9cb714097d0c45tedbo        @param device   Specifies a device for the canvas to draw into.
5220ab88413000fcc8668eeab25d9cb714097d0c45tedbo    */
5320ab88413000fcc8668eeab25d9cb714097d0c45tedbo    explicit SkCanvas(SkDevice* device);
5420ab88413000fcc8668eeab25d9cb714097d0c45tedbo
5520ab88413000fcc8668eeab25d9cb714097d0c45tedbo    /** Deprecated - Construct a canvas with the specified bitmap to draw into.
560910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param bitmap   Specifies a bitmap for the canvas to draw into. Its
570910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                        structure are copied to the canvas.
580910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    */
590910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    explicit SkCanvas(const SkBitmap& bitmap);
600910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    virtual ~SkCanvas();
610910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
620910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    ///////////////////////////////////////////////////////////////////////////
630910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
641cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    /**
654f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger     *  Trigger the immediate execution of all pending draw operations.
664f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger     */
674f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger    void flush();
684f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger
694f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger    /**
701cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *  Return the width/height of the underlying device. The current drawable
711cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *  area may be small (due to clipping or saveLayer). For a canvas with
721cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *  no device, 0,0 will be returned.
731cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     */
741cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    SkISize getDeviceSize() const;
751cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
760910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    /** Return the canvas' device object, which may be null. The device holds
770910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        the bitmap of the pixels that the canvas draws into. The reference count
780910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        of the returned device is not changed by this call.
790910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    */
800910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkDevice* getDevice() const;
810910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
820910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    /** Specify a device for this canvas to draw into. If it is not null, its
830910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        reference count is incremented. If the canvas was already holding a
840910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        device, its reference count is decremented. The new device is returned.
850910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    */
864f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger    virtual SkDevice* setDevice(SkDevice* device);
8720ab88413000fcc8668eeab25d9cb714097d0c45tedbo
8887b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger    /**
8987b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger     *  saveLayer() can create another device (which is later drawn onto
9087b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger     *  the previous device). getTopDevice() returns the top-most device current
9187b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger     *  installed. Note that this can change on other calls like save/restore,
9287b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger     *  so do not access this device after subsequent canvas calls.
9387b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger     *  The reference count of the device is not changed.
9487b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger     */
9587b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger    SkDevice* getTopDevice() const;
9687b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger
9740528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger    /**
9840528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger     *  Create a new raster device and make it current. This also returns
9940528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger     *  the new device.
10040528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger     */
1011cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    SkDevice* setBitmapDevice(const SkBitmap& bitmap);
10240528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger
10340528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger    /**
1041cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *  Shortcut for getDevice()->createCompatibleDevice(...).
1051cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *  If getDevice() == NULL, this method does nothing, and returns NULL.
10640528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger     */
1074f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger    SkDevice* createCompatibleDevice(SkBitmap::Config config,
1081cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                    int width, int height,
1091cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                    bool isOpaque);
1101cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
1111cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    ///////////////////////////////////////////////////////////////////////////
11240528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger
11340528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger    /**
1141cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * This enum can be used with read/writePixels to perform a pixel ops to or
1151cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * from an 8888 config other than Skia's native config (SkPMColor). There
1161cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * are three byte orders supported: native, BGRA, and RGBA. Each has a
1171cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * premultiplied and unpremultiplied variant.
1181cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *
1191cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * Components of a 8888 pixel can be packed/unpacked from a 32bit word using
1201cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * either byte offsets or shift values. Byte offsets are endian-invariant
1211cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * while shifts are not. BGRA and RGBA configs are defined by byte
1221cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * orderings. The native config is defined by shift values (SK_A32_SHIFT,
1231cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * ..., SK_B32_SHIFT).
12440528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger     */
1251cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    enum Config8888 {
1261cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        /**
1271cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger         * Skia's native order specified by:
1281cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger         *      SK_A32_SHIFT, SK_R32_SHIFT, SK_G32_SHIFT, and SK_B32_SHIFT
1291cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger         *
1301cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger         * kNative_Premul_Config8888 is equivalent to SkPMColor
1311cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger         * kNative_Unpremul_Config8888 has the same component order as SkPMColor
1321cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger         * but is not premultiplied.
1331cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger         */
1341cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        kNative_Premul_Config8888,
1351cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        kNative_Unpremul_Config8888,
1361cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        /**
1371cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger         * low byte to high byte: B, G, R, A.
1381cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger         */
1391cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        kBGRA_Premul_Config8888,
1401cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        kBGRA_Unpremul_Config8888,
1411cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        /**
1421cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger         * low byte to high byte: R, G, B, A.
1431cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger         */
1441cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        kRGBA_Premul_Config8888,
1451cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        kRGBA_Unpremul_Config8888,
1461cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    };
14740528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger
1481cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    /**
1491cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *  On success (returns true), copy the canvas pixels into the bitmap.
1501cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *  On failure, the bitmap parameter is left unchanged and false is
1511cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *  returned.
1521cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *
1531cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *  The canvas' pixels are converted to the bitmap's config. The only
1541cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *  supported config is kARGB_8888_Config, though this is likely to be
1551cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *  relaxed in  the future. The meaning of config kARGB_8888_Config is
1561cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *  modified by the enum param config8888. The default value interprets
1571cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *  kARGB_8888_Config as SkPMColor
1581cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *
1591cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *  If the bitmap has pixels already allocated, the canvas pixels will be
1604f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger     *  written there. If not, bitmap->allocPixels() will be called
1611cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *  automatically. If the bitmap is backed by a texture readPixels will
1621cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *  fail.
1631cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *
1641cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *  The actual pixels written is the intersection of the canvas' bounds, and
1651cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *  the rectangle formed by the bitmap's width,height and the specified x,y.
1661cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *  If bitmap pixels extend outside of that intersection, they will not be
1671cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *  modified.
1681cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *
1691cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *  Other failure conditions:
1701cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *    * If the canvas is backed by a non-raster device (e.g. PDF) then
1711cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *       readPixels will fail.
1721cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *    * If bitmap is texture-backed then readPixels will fail. (This may be
1731cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *       relaxed in the future.)
1741cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *
1751cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *  Example that reads the entire canvas into a bitmap using the native
1761cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *  SkPMColor:
1771cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *    SkISize size = canvas->getDeviceSize();
1781cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *    bitmap->setConfig(SkBitmap::kARGB_8888_Config, size.fWidth,
1791cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *                                                   size.fHeight);
1801cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *    if (canvas->readPixels(bitmap, 0, 0)) {
1811cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *       // use the pixels
1821cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *    }
1831cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     */
1841cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    bool readPixels(SkBitmap* bitmap,
1851cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                    int x, int y,
1861cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                    Config8888 config8888 = kNative_Premul_Config8888);
18740528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger
18840528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger    /**
1891cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * DEPRECATED: This will be removed as soon as webkit is no longer relying
1901cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * on it. The bitmap is resized to the intersection of srcRect and the
1911cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * canvas bounds. New pixels are always allocated on success. Bitmap is
1921cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * unmodified on failure.
19340528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger     */
19440528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger    bool readPixels(const SkIRect& srcRect, SkBitmap* bitmap);
19540528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger
19640528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger    /**
19740528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger     *  Similar to draw sprite, this method will copy the pixels in bitmap onto
1981cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *  the canvas, with the top/left corner specified by (x, y). The canvas'
1991cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *  pixel values are completely replaced: there is no blending.
2001cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *
2011cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *  Currently if bitmap is backed by a texture this is a no-op. This may be
2021cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *  relaxed in the future.
2031cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *
2041cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *  If the bitmap has config kARGB_8888_Config then the config8888 param
2051cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *  will determines how the pixel valuess are intepreted. If the bitmap is
2061cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *  not kARGB_8888_Config then this parameter is ignored.
2071cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *
2081cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *  Note: If you are recording drawing commands on this canvas to
2091cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *  SkPicture, writePixels() is ignored!
21040528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger     */
2111cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    void writePixels(const SkBitmap& bitmap,
2121cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                     int x, int y,
2131cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                     Config8888 config8888 = kNative_Premul_Config8888);
2140910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
2150910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    ///////////////////////////////////////////////////////////////////////////
21620ab88413000fcc8668eeab25d9cb714097d0c45tedbo
2170910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    enum SaveFlags {
2180910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        /** save the matrix state, restoring it on restore() */
2190910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        kMatrix_SaveFlag            = 0x01,
2200910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        /** save the clip state, restoring it on restore() */
2210910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        kClip_SaveFlag              = 0x02,
2220910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        /** the layer needs to support per-pixel alpha */
2230910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        kHasAlphaLayer_SaveFlag     = 0x04,
2240910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        /** the layer needs to support 8-bits per color component */
2250910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        kFullColorLayer_SaveFlag    = 0x08,
2260910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        /** the layer should clip against the bounds argument */
2270910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        kClipToLayer_SaveFlag       = 0x10,
2280910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
2290910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        // helper masks for common choices
2300910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        kMatrixClip_SaveFlag        = 0x03,
2310910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        kARGB_NoClipLayer_SaveFlag  = 0x0F,
2320910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        kARGB_ClipLayer_SaveFlag    = 0x1F
2330910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    };
2340910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
2358f7d36c67f1bdde7ca1680857936f6af951e19e2Mike Reed    /** This call saves the current matrix, clip, and drawFilter, and pushes a
2360910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        copy onto a private stack. Subsequent calls to translate, scale,
2378f7d36c67f1bdde7ca1680857936f6af951e19e2Mike Reed        rotate, skew, concat or clipRect, clipPath, and setDrawFilter all
2388f7d36c67f1bdde7ca1680857936f6af951e19e2Mike Reed        operate on this copy.
2398f7d36c67f1bdde7ca1680857936f6af951e19e2Mike Reed        When the balancing call to restore() is made, the previous matrix, clip,
2408f7d36c67f1bdde7ca1680857936f6af951e19e2Mike Reed        and drawFilter are restored.
2410910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @return The value to pass to restoreToCount() to balance this save()
2420910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    */
2430910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    virtual int save(SaveFlags flags = kMatrixClip_SaveFlag);
2440910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
2450910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    /** This behaves the same as save(), but in addition it allocates an
2460910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        offscreen bitmap. All drawing calls are directed there, and only when
2470910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        the balancing call to restore() is made is that offscreen transfered to
2488f7d36c67f1bdde7ca1680857936f6af951e19e2Mike Reed        the canvas (or the previous layer).
24940528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger        @param bounds (may be null) This rect, if non-null, is used as a hint to
25040528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger                      limit the size of the offscreen, and thus drawing may be
25140528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger                      clipped to it, though that clipping is not guaranteed to
25240528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger                      happen. If exact clipping is desired, use clipRect().
2530910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param paint (may be null) This is copied, and is applied to the
2540910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                     offscreen when restore() is called
2550910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param flags  LayerFlags
2560910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @return The value to pass to restoreToCount() to balance this save()
2570910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    */
2580910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    virtual int saveLayer(const SkRect* bounds, const SkPaint* paint,
2590910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                          SaveFlags flags = kARGB_ClipLayer_SaveFlag);
2600910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
2610910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    /** This behaves the same as save(), but in addition it allocates an
2620910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        offscreen bitmap. All drawing calls are directed there, and only when
2630910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        the balancing call to restore() is made is that offscreen transfered to
2648f7d36c67f1bdde7ca1680857936f6af951e19e2Mike Reed        the canvas (or the previous layer).
26540528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger        @param bounds (may be null) This rect, if non-null, is used as a hint to
26640528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger                      limit the size of the offscreen, and thus drawing may be
26740528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger                      clipped to it, though that clipping is not guaranteed to
26840528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger                      happen. If exact clipping is desired, use clipRect().
2690910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param alpha  This is applied to the offscreen when restore() is called.
2700910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param flags  LayerFlags
2710910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @return The value to pass to restoreToCount() to balance this save()
2720910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    */
2730910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    int saveLayerAlpha(const SkRect* bounds, U8CPU alpha,
2740910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                       SaveFlags flags = kARGB_ClipLayer_SaveFlag);
2750910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
2760910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    /** This call balances a previous call to save(), and is used to remove all
2778f7d36c67f1bdde7ca1680857936f6af951e19e2Mike Reed        modifications to the matrix/clip/drawFilter state since the last save
2788f7d36c67f1bdde7ca1680857936f6af951e19e2Mike Reed        call.
2798f7d36c67f1bdde7ca1680857936f6af951e19e2Mike Reed        It is an error to call restore() more times than save() was called.
2800910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    */
2810910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    virtual void restore();
2820910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
2830910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    /** Returns the number of matrix/clip states on the SkCanvas' private stack.
2840910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        This will equal # save() calls - # restore() calls.
2850910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    */
2860910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    int getSaveCount() const;
2870910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
2880910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    /** Efficient way to pop any calls to save() that happened after the save
2890910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        count reached saveCount. It is an error for saveCount to be less than
2900910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        getSaveCount()
2910910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param saveCount    The number of save() levels to restore from
2920910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    */
2930910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    void restoreToCount(int saveCount);
2940910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
2951cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    /** Returns true if drawing is currently going to a layer (from saveLayer)
2961cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *  rather than to the root device.
2971cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     */
2984f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger    virtual bool isDrawingToLayer() const;
2991cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
3000910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    /** Preconcat the current matrix with the specified translation
3010910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param dx   The distance to translate in X
3020910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param dy   The distance to translate in Y
3030910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        returns true if the operation succeeded (e.g. did not overflow)
3040910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    */
3050910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    virtual bool translate(SkScalar dx, SkScalar dy);
3060910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
3070910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    /** Preconcat the current matrix with the specified scale.
3080910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param sx   The amount to scale in X
3090910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param sy   The amount to scale in Y
3100910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        returns true if the operation succeeded (e.g. did not overflow)
3110910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    */
3120910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    virtual bool scale(SkScalar sx, SkScalar sy);
3130910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
3140910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    /** Preconcat the current matrix with the specified rotation.
3150910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param degrees  The amount to rotate, in degrees
3160910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        returns true if the operation succeeded (e.g. did not overflow)
3170910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    */
3180910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    virtual bool rotate(SkScalar degrees);
3190910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
3200910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    /** Preconcat the current matrix with the specified skew.
3210910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param sx   The amount to skew in X
3220910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param sy   The amount to skew in Y
3230910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        returns true if the operation succeeded (e.g. did not overflow)
3240910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    */
3250910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    virtual bool skew(SkScalar sx, SkScalar sy);
3260910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
3270910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    /** Preconcat the current matrix with the specified matrix.
3280910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param matrix   The matrix to preconcatenate with the current matrix
3290910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @return true if the operation succeeded (e.g. did not overflow)
3300910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    */
3310910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    virtual bool concat(const SkMatrix& matrix);
33240528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger
3330910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    /** Replace the current matrix with a copy of the specified matrix.
3340910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param matrix The matrix that will be copied into the current matrix.
3350910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    */
3360910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    virtual void setMatrix(const SkMatrix& matrix);
33740528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger
3380910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    /** Helper for setMatrix(identity). Sets the current matrix to identity.
3390910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    */
3400910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    void resetMatrix();
3410910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
3420910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    /** Modify the current clip with the specified rectangle.
3430910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param rect The rect to intersect with the current clip
3440910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param op The region op to apply to the current clip
3450910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @return true if the canvas' clip is non-empty
3460910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    */
3470910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    virtual bool clipRect(const SkRect& rect,
3481cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                          SkRegion::Op op = SkRegion::kIntersect_Op,
3491cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                          bool doAntiAlias = false);
3500910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
3510910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    /** Modify the current clip with the specified path.
3520910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param path The path to apply to the current clip
3530910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param op The region op to apply to the current clip
3540910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @return true if the canvas' new clip is non-empty
3550910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    */
3560910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    virtual bool clipPath(const SkPath& path,
3571cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                          SkRegion::Op op = SkRegion::kIntersect_Op,
3581cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                          bool doAntiAlias = false);
3590910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
3600910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    /** Modify the current clip with the specified region. Note that unlike
3610910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        clipRect() and clipPath() which transform their arguments by the current
3620910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        matrix, clipRegion() assumes its argument is already in device
3630910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        coordinates, and so no transformation is performed.
3640910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param deviceRgn    The region to apply to the current clip
3650910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param op The region op to apply to the current clip
3660910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @return true if the canvas' new clip is non-empty
3670910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    */
3680910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    virtual bool clipRegion(const SkRegion& deviceRgn,
3690910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                            SkRegion::Op op = SkRegion::kIntersect_Op);
3700910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
3710910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    /** Helper for clipRegion(rgn, kReplace_Op). Sets the current clip to the
3720910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        specified region. This does not intersect or in any other way account
3730910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        for the existing clip region.
3740910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param deviceRgn The region to copy into the current clip.
3750910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @return true if the new clip region is non-empty
3760910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    */
3770910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    bool setClipRegion(const SkRegion& deviceRgn) {
3780910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        return this->clipRegion(deviceRgn, SkRegion::kReplace_Op);
3790910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    }
3800910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
3810910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    /** Enum describing how to treat edges when performing quick-reject tests
3820910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        of a geometry against the current clip. Treating them as antialiased
3830910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        (kAA_EdgeType) will take into account the extra pixels that may be drawn
3840910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        if the edge does not lie exactly on a device pixel boundary (after being
3850910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        transformed by the current matrix).
3860910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    */
3870910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    enum EdgeType {
3880910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        /** Treat the edges as B&W (not antialiased) for the purposes of testing
3890910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            against the current clip
3900910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        */
3910910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        kBW_EdgeType,
3920910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        /** Treat the edges as antialiased for the purposes of testing
3930910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            against the current clip
3940910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        */
3950910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        kAA_EdgeType
3960910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    };
3970910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
3980910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    /** Return true if the specified rectangle, after being transformed by the
3990910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        current matrix, would lie completely outside of the current clip. Call
4000910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        this to check if an area you intend to draw into is clipped out (and
4010910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        therefore you can skip making the draw calls).
4020910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param rect the rect to compare with the current clip
4030910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param et  specifies how to treat the edges (see EdgeType)
4040910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @return true if the rect (transformed by the canvas' matrix) does not
4050910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                     intersect with the canvas' clip
4060910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    */
4070910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    bool quickReject(const SkRect& rect, EdgeType et) const;
4080910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
4090910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    /** Return true if the specified path, after being transformed by the
4100910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        current matrix, would lie completely outside of the current clip. Call
4110910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        this to check if an area you intend to draw into is clipped out (and
4120910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        therefore you can skip making the draw calls). Note, for speed it may
4130910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        return false even if the path itself might not intersect the clip
4140910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        (i.e. the bounds of the path intersects, but the path does not).
4150910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param path The path to compare with the current clip
4160910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param et  specifies how to treat the edges (see EdgeType)
4170910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @return true if the path (transformed by the canvas' matrix) does not
4180910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                     intersect with the canvas' clip
4190910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    */
4200910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    bool quickReject(const SkPath& path, EdgeType et) const;
4210910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
4220910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    /** Return true if the horizontal band specified by top and bottom is
4230910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        completely clipped out. This is a conservative calculation, meaning
4240910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        that it is possible that if the method returns false, the band may still
4250910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        in fact be clipped out, but the converse is not true. If this method
4260910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        returns true, then the band is guaranteed to be clipped out.
4270910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param top  The top of the horizontal band to compare with the clip
4280910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param bottom The bottom of the horizontal and to compare with the clip
4290910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @return true if the horizontal band is completely clipped out (i.e. does
4300910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                     not intersect the current clip)
4310910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    */
4324f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger    bool quickRejectY(SkScalar top, SkScalar bottom, EdgeType et) const {
4334f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger        SkASSERT(SkScalarToCompareType(top) <= SkScalarToCompareType(bottom));
4344f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger        const SkRectCompareType& clipR = this->getLocalClipBoundsCompareType(et);
4354f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger        // In the case where the clip is empty and we are provided with a
4364f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger        // negative top and positive bottom parameter then this test will return
4374f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger        // false even though it will be clipped. We have chosen to exclude that
4384f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger        // check as it is rare and would result double the comparisons.
4394f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger        return SkScalarToCompareType(top) >= clipR.fBottom
4404f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger            || SkScalarToCompareType(bottom) <= clipR.fTop;
4414f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger    }
4420910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
4430910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    /** Return the bounds of the current clip (in local coordinates) in the
4440910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        bounds parameter, and return true if it is non-empty. This can be useful
4450910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        in a way similar to quickReject, in that it tells you that drawing
4460910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        outside of these bounds will be clipped out.
4470910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    */
4480910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    bool getClipBounds(SkRect* bounds, EdgeType et = kAA_EdgeType) const;
4490910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
4501cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    /** Return the bounds of the current clip, in device coordinates; returns
4511cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        true if non-empty. Maybe faster than getting the clip explicitly and
4521cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        then taking its bounds.
4531cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    */
4541cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    bool getClipDeviceBounds(SkIRect* bounds) const;
4554f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger
4561cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
4570910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    /** Fill the entire canvas' bitmap (restricted to the current clip) with the
45859f59bde0b05a6ac5ff28fdebc1942dbf0d43aabMike Reed        specified ARGB color, using the specified mode.
4590910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param a    the alpha component (0..255) of the color to fill the canvas
4600910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param r    the red component (0..255) of the color to fill the canvas
4610910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param g    the green component (0..255) of the color to fill the canvas
4620910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param b    the blue component (0..255) of the color to fill the canvas
4630910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param mode the mode to apply the color in (defaults to SrcOver)
4640910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    */
4650910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    void drawARGB(U8CPU a, U8CPU r, U8CPU g, U8CPU b,
46659f59bde0b05a6ac5ff28fdebc1942dbf0d43aabMike Reed                  SkXfermode::Mode mode = SkXfermode::kSrcOver_Mode);
4670910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
4680910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    /** Fill the entire canvas' bitmap (restricted to the current clip) with the
46959f59bde0b05a6ac5ff28fdebc1942dbf0d43aabMike Reed        specified color and mode.
4700910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param color    the color to draw with
4710910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param mode the mode to apply the color in (defaults to SrcOver)
4720910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    */
4730910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    void drawColor(SkColor color,
47459f59bde0b05a6ac5ff28fdebc1942dbf0d43aabMike Reed                   SkXfermode::Mode mode = SkXfermode::kSrcOver_Mode);
4750910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
47635e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger    /**
47735e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger     *  This erases the entire drawing surface to the specified color,
47835e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger     *  irrespective of the clip. It does not blend with the previous pixels,
47935e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger     *  but always overwrites them.
48035e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger     *
48135e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger     *  It is roughly equivalent to the following:
48235e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger     *      canvas.save();
48335e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger     *      canvas.clipRect(hugeRect, kReplace_Op);
48435e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger     *      paint.setColor(color);
48535e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger     *      paint.setXfermodeMode(kSrc_Mode);
48635e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger     *      canvas.drawPaint(paint);
48735e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger     *      canvas.restore();
48835e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger     *  though it is almost always much more efficient.
48935e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger     */
49035e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger    virtual void clear(SkColor);
49135e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger
49235e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger    /**
49335e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger     *  Fill the entire canvas' bitmap (restricted to the current clip) with the
49435e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger     *  specified paint.
49535e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger     *  @param paint    The paint used to fill the canvas
49635e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger     */
4970910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    virtual void drawPaint(const SkPaint& paint);
4980910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
4990910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    enum PointMode {
5000910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        /** drawPoints draws each point separately */
5010910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        kPoints_PointMode,
5020910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        /** drawPoints draws each pair of points as a line segment */
5030910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        kLines_PointMode,
5040910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        /** drawPoints draws the array of points as a polygon */
5050910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        kPolygon_PointMode
5060910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    };
5070910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
5080910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    /** Draw a series of points, interpreted based on the PointMode mode. For
5090910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        all modes, the count parameter is interpreted as the total number of
5100910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        points. For kLine mode, count/2 line segments are drawn.
5110910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        For kPoint mode, each point is drawn centered at its coordinate, and its
5120910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        size is specified by the paint's stroke-width. It draws as a square,
5130910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        unless the paint's cap-type is round, in which the points are drawn as
5140910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        circles.
5150910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        For kLine mode, each pair of points is drawn as a line segment,
5160910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        respecting the paint's settings for cap/join/width.
5170910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        For kPolygon mode, the entire array is drawn as a series of connected
5180910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        line segments.
5190910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        Note that, while similar, kLine and kPolygon modes draw slightly
5200910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        differently than the equivalent path built with a series of moveto,
5210910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        lineto calls, in that the path will draw all of its contours at once,
5220910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        with no interactions if contours intersect each other (think XOR
5230910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        xfermode). drawPoints always draws each element one at a time.
5240910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param mode     PointMode specifying how to draw the array of points.
5250910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param count    The number of points in the array
5260910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param pts      Array of points to draw
5270910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param paint    The paint used to draw the points
5280910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    */
5290910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    virtual void drawPoints(PointMode mode, size_t count, const SkPoint pts[],
5300910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                            const SkPaint& paint);
5310910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
5320910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    /** Helper method for drawing a single point. See drawPoints() for a more
5330910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        details.
5340910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    */
5350910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    void drawPoint(SkScalar x, SkScalar y, const SkPaint& paint);
53640528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger
5370910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    /** Draws a single pixel in the specified color.
5380910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param x        The X coordinate of which pixel to draw
5390910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param y        The Y coordiante of which pixel to draw
5400910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param color    The color to draw
5410910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    */
5420910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    void drawPoint(SkScalar x, SkScalar y, SkColor color);
5430910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
5440910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    /** Draw a line segment with the specified start and stop x,y coordinates,
5450910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        using the specified paint. NOTE: since a line is always "framed", the
5460910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        paint's Style is ignored.
5470910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param x0    The x-coordinate of the start point of the line
5480910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param y0    The y-coordinate of the start point of the line
5490910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param x1    The x-coordinate of the end point of the line
5500910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param y1    The y-coordinate of the end point of the line
5510910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param paint The paint used to draw the line
5520910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    */
5530910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    void drawLine(SkScalar x0, SkScalar y0, SkScalar x1, SkScalar y1,
5540910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                  const SkPaint& paint);
5550910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
5560910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    /** Draw the specified rectangle using the specified paint. The rectangle
5570910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        will be filled or stroked based on the Style in the paint.
5580910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param rect     The rect to be drawn
5590910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param paint    The paint used to draw the rect
5600910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    */
5610910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    virtual void drawRect(const SkRect& rect, const SkPaint& paint);
5620910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
5630910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    /** Draw the specified rectangle using the specified paint. The rectangle
5640910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        will be filled or framed based on the Style in the paint.
5650910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param rect     The rect to be drawn
5660910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param paint    The paint used to draw the rect
5670910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    */
5680910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    void drawIRect(const SkIRect& rect, const SkPaint& paint)
5690910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    {
5700910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        SkRect r;
5710910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        r.set(rect);    // promotes the ints to scalars
5720910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        this->drawRect(r, paint);
5730910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    }
57440528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger
5750910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    /** Draw the specified rectangle using the specified paint. The rectangle
5760910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        will be filled or framed based on the Style in the paint.
5770910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param left     The left side of the rectangle to be drawn
5780910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param top      The top side of the rectangle to be drawn
5790910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param right    The right side of the rectangle to be drawn
5800910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param bottom   The bottom side of the rectangle to be drawn
5810910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param paint    The paint used to draw the rect
5820910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    */
5830910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    void drawRectCoords(SkScalar left, SkScalar top, SkScalar right,
5840910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                        SkScalar bottom, const SkPaint& paint);
5850910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
5860910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    /** Draw the specified oval using the specified paint. The oval will be
5870910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        filled or framed based on the Style in the paint.
5880910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param oval     The rectangle bounds of the oval to be drawn
5890910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param paint    The paint used to draw the oval
5900910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    */
5910910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    void drawOval(const SkRect& oval, const SkPaint&);
5920910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
5930910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    /** Draw the specified circle using the specified paint. If radius is <= 0,
5940910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        then nothing will be drawn. The circle will be filled
5950910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        or framed based on the Style in the paint.
5960910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param cx       The x-coordinate of the center of the cirle to be drawn
5970910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param cy       The y-coordinate of the center of the cirle to be drawn
5980910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param radius   The radius of the cirle to be drawn
5990910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param paint    The paint used to draw the circle
6000910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    */
6010910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    void drawCircle(SkScalar cx, SkScalar cy, SkScalar radius,
6020910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                    const SkPaint& paint);
6030910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
6040910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    /** Draw the specified arc, which will be scaled to fit inside the
6050910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        specified oval. If the sweep angle is >= 360, then the oval is drawn
6060910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        completely. Note that this differs slightly from SkPath::arcTo, which
6070910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        treats the sweep angle mod 360.
6080910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param oval The bounds of oval used to define the shape of the arc
6090910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param startAngle Starting angle (in degrees) where the arc begins
6100910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param sweepAngle Sweep angle (in degrees) measured clockwise
6110910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param useCenter true means include the center of the oval. For filling
6120910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                         this will draw a wedge. False means just use the arc.
6130910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param paint    The paint used to draw the arc
6140910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    */
6150910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    void drawArc(const SkRect& oval, SkScalar startAngle, SkScalar sweepAngle,
6160910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                 bool useCenter, const SkPaint& paint);
6170910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
6180910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    /** Draw the specified round-rect using the specified paint. The round-rect
6190910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        will be filled or framed based on the Style in the paint.
6200910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param rect     The rectangular bounds of the roundRect to be drawn
6210910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param rx       The x-radius of the oval used to round the corners
6220910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param ry       The y-radius of the oval used to round the corners
6230910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param paint    The paint used to draw the roundRect
6240910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    */
6250910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    void drawRoundRect(const SkRect& rect, SkScalar rx, SkScalar ry,
6260910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                       const SkPaint& paint);
6270910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
6280910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    /** Draw the specified path using the specified paint. The path will be
6290910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        filled or framed based on the Style in the paint.
6300910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param path     The path to be drawn
6310910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param paint    The paint used to draw the path
6320910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    */
6330910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    virtual void drawPath(const SkPath& path, const SkPaint& paint);
6340910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
6350910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    /** Draw the specified bitmap, with its top/left corner at (x,y), using the
6360910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        specified paint, transformed by the current matrix. Note: if the paint
6370910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        contains a maskfilter that generates a mask which extends beyond the
6380910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        bitmap's original width/height, then the bitmap will be drawn as if it
6390910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        were in a Shader with CLAMP mode. Thus the color outside of the original
6400910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        width/height will be the edge color replicated.
6410910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param bitmap   The bitmap to be drawn
6420910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param left     The position of the left side of the bitmap being drawn
6430910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param top      The position of the top side of the bitmap being drawn
6440910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param paint    The paint used to draw the bitmap, or NULL
6450910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    */
6460910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    virtual void drawBitmap(const SkBitmap& bitmap, SkScalar left, SkScalar top,
6470910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                            const SkPaint* paint = NULL);
6480910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
6490910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    /** Draw the specified bitmap, with the specified matrix applied (before the
6500910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        canvas' matrix is applied).
6510910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param bitmap   The bitmap to be drawn
6520910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param src      Optional: specify the subset of the bitmap to be drawn
6530910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param dst      The destination rectangle where the scaled/translated
6540910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                        image will be drawn
6550910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param paint    The paint used to draw the bitmap, or NULL
6560910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    */
6570910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    virtual void drawBitmapRect(const SkBitmap& bitmap, const SkIRect* src,
6580910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                                const SkRect& dst, const SkPaint* paint = NULL);
6590910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
6600910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    virtual void drawBitmapMatrix(const SkBitmap& bitmap, const SkMatrix& m,
6610910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                                  const SkPaint* paint = NULL);
66240528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger
6631cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    /**
6641cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *  Draw the bitmap stretched differentially to fit into dst.
6651cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *  center is a rect within the bitmap, and logically divides the bitmap
6661cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *  into 9 sections (3x3). For example, if the middle pixel of a [5x5]
6671cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *  bitmap is the "center", then the center-rect should be [2, 2, 3, 3].
6681cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *
6691cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *  If the dst is >= the bitmap size, then...
6701cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *  - The 4 corners are not stretch at all.
6711cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *  - The sides are stretch in only one axis.
6721cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *  - The center is stretch in both axes.
6731cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * Else, for each axis where dst < bitmap,
6741cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *  - The corners shrink proportionally
6751cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *  - The sides (along the shrink axis) and center are not drawn
6761cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     */
6771cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    virtual void drawBitmapNine(const SkBitmap& bitmap, const SkIRect& center,
6781cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                const SkRect& dst, const SkPaint* paint = NULL);
6791cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
6800910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    /** Draw the specified bitmap, with its top/left corner at (x,y),
6810910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        NOT transformed by the current matrix. Note: if the paint
6820910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        contains a maskfilter that generates a mask which extends beyond the
6830910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        bitmap's original width/height, then the bitmap will be drawn as if it
6840910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        were in a Shader with CLAMP mode. Thus the color outside of the original
6850910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        width/height will be the edge color replicated.
6860910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param bitmap   The bitmap to be drawn
6870910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param left     The position of the left side of the bitmap being drawn
6880910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param top      The position of the top side of the bitmap being drawn
6890910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param paint    The paint used to draw the bitmap, or NULL
6900910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    */
6910910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    virtual void drawSprite(const SkBitmap& bitmap, int left, int top,
6920910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                            const SkPaint* paint = NULL);
6930910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
6940910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    /** Draw the text, with origin at (x,y), using the specified paint.
6950910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        The origin is interpreted based on the Align setting in the paint.
6960910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param text The text to be drawn
6970910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param byteLength   The number of bytes to read from the text parameter
6980910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param x        The x-coordinate of the origin of the text being drawn
6990910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param y        The y-coordinate of the origin of the text being drawn
7000910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param paint    The paint used for the text (e.g. color, size, style)
7010910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    */
7020910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    virtual void drawText(const void* text, size_t byteLength, SkScalar x,
7030910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                          SkScalar y, const SkPaint& paint);
7040910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
7050910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    /** Draw the text, with each character/glyph origin specified by the pos[]
70640528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger        array. The origin is interpreted by the Align setting in the paint.
7070910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param text The text to be drawn
7080910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param byteLength   The number of bytes to read from the text parameter
7090910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param pos      Array of positions, used to position each character
7100910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param paint    The paint used for the text (e.g. color, size, style)
7110910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        */
7120910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    virtual void drawPosText(const void* text, size_t byteLength,
7130910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                             const SkPoint pos[], const SkPaint& paint);
71440528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger
7150910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    /** Draw the text, with each character/glyph origin specified by the x
7160910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        coordinate taken from the xpos[] array, and the y from the constY param.
71740528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger        The origin is interpreted by the Align setting in the paint.
7180910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param text The text to be drawn
7190910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param byteLength   The number of bytes to read from the text parameter
7200910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param xpos     Array of x-positions, used to position each character
7210910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param constY   The shared Y coordinate for all of the positions
7220910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param paint    The paint used for the text (e.g. color, size, style)
7230910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        */
7240910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    virtual void drawPosTextH(const void* text, size_t byteLength,
7250910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                              const SkScalar xpos[], SkScalar constY,
7260910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                              const SkPaint& paint);
72740528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger
7280910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    /** Draw the text, with origin at (x,y), using the specified paint, along
7290910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        the specified path. The paint's Align setting determins where along the
7300910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        path to start the text.
7310910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param text The text to be drawn
7320910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param byteLength   The number of bytes to read from the text parameter
7330910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param path         The path the text should follow for its baseline
7340910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param hOffset      The distance along the path to add to the text's
7350910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                            starting position
7360910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param vOffset      The distance above(-) or below(+) the path to
7370910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                            position the text
7380910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param paint        The paint used for the text
7390910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    */
7400910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    void drawTextOnPathHV(const void* text, size_t byteLength,
7410910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                          const SkPath& path, SkScalar hOffset,
7420910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                          SkScalar vOffset, const SkPaint& paint);
7430910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
7440910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    /** Draw the text, with origin at (x,y), using the specified paint, along
7450910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        the specified path. The paint's Align setting determins where along the
7460910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        path to start the text.
7470910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param text The text to be drawn
7480910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param byteLength   The number of bytes to read from the text parameter
7490910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param path         The path the text should follow for its baseline
7500910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param matrix       (may be null) Applied to the text before it is
7510910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                            mapped onto the path
7520910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param paint        The paint used for the text
7530910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        */
7540910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    virtual void drawTextOnPath(const void* text, size_t byteLength,
7550910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                                const SkPath& path, const SkMatrix* matrix,
7560910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                                const SkPaint& paint);
7570910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
7581cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#ifdef SK_BUILD_FOR_ANDROID
759a2dfb00239c367c3663e8487a8213d0edad238baAndreas Borglin    /** Draw the text on path, with each character/glyph origin specified by the pos[]
760a2dfb00239c367c3663e8487a8213d0edad238baAndreas Borglin        array. The origin is interpreted by the Align setting in the paint.
761a2dfb00239c367c3663e8487a8213d0edad238baAndreas Borglin        @param text The text to be drawn
762a2dfb00239c367c3663e8487a8213d0edad238baAndreas Borglin        @param byteLength   The number of bytes to read from the text parameter
763a2dfb00239c367c3663e8487a8213d0edad238baAndreas Borglin        @param pos      Array of positions, used to position each character
764a2dfb00239c367c3663e8487a8213d0edad238baAndreas Borglin        @param paint    The paint used for the text (e.g. color, size, style)
765a2dfb00239c367c3663e8487a8213d0edad238baAndreas Borglin        @param path The path to draw on
766a2dfb00239c367c3663e8487a8213d0edad238baAndreas Borglin        @param matrix The canvas matrix
767a2dfb00239c367c3663e8487a8213d0edad238baAndreas Borglin        */
768a2dfb00239c367c3663e8487a8213d0edad238baAndreas Borglin    void drawPosTextOnPath(const void* text, size_t byteLength,
769a2dfb00239c367c3663e8487a8213d0edad238baAndreas Borglin                           const SkPoint pos[], const SkPaint& paint,
770a2dfb00239c367c3663e8487a8213d0edad238baAndreas Borglin                           const SkPath& path, const SkMatrix* matrix);
77105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger#endif
772a2dfb00239c367c3663e8487a8213d0edad238baAndreas Borglin
7730910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    /** Draw the picture into this canvas. This method effective brackets the
7740910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        playback of the picture's draw calls with save/restore, so the state
7750910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        of this canvas will be unchanged after this call. This contrasts with
7760910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        the more immediate method SkPicture::draw(), which does not bracket
7770910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        the canvas with save/restore, thus the canvas may be left in a changed
7780910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        state after the call.
7790910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param picture The recorded drawing commands to playback into this
7800910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                       canvas.
7810910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    */
7820910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    virtual void drawPicture(SkPicture& picture);
78340528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger
7840910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    enum VertexMode {
7850910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        kTriangles_VertexMode,
7860910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        kTriangleStrip_VertexMode,
7870910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        kTriangleFan_VertexMode
7880910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    };
78940528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger
7900910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    /** Draw the array of vertices, interpreted as triangles (based on mode).
7910910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param vmode How to interpret the array of vertices
7920910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param vertexCount The number of points in the vertices array (and
7930910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                    corresponding texs and colors arrays if non-null)
7940910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param vertices Array of vertices for the mesh
7950910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param texs May be null. If not null, specifies the coordinate
7960910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                             in texture space for each vertex.
7970910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param colors May be null. If not null, specifies a color for each
7980910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                      vertex, to be interpolated across the triangle.
7990910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param xmode Used if both texs and colors are present. In this
8000910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                    case the colors are combined with the texture using mode,
8010910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                    before being drawn using the paint. If mode is null, then
80259f59bde0b05a6ac5ff28fdebc1942dbf0d43aabMike Reed                    kMultiply_Mode is used.
8030910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param indices If not null, array of indices to reference into the
8040910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                    vertex (texs, colors) array.
8050910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param indexCount number of entries in the indices array (if not null)
80640528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger        @param paint Specifies the shader/texture if present.
8070910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    */
8080910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    virtual void drawVertices(VertexMode vmode, int vertexCount,
8090910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                              const SkPoint vertices[], const SkPoint texs[],
8100910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                              const SkColor colors[], SkXfermode* xmode,
8110910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                              const uint16_t indices[], int indexCount,
8120910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                              const SkPaint& paint);
8130910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
81493d11b5b461a8677a8e3ffa94260f4f9897070acMike Reed    /** Send a blob of data to the canvas.
81593d11b5b461a8677a8e3ffa94260f4f9897070acMike Reed        For canvases that draw, this call is effectively a no-op, as the data
81693d11b5b461a8677a8e3ffa94260f4f9897070acMike Reed        is not parsed, but just ignored. However, this call exists for
81793d11b5b461a8677a8e3ffa94260f4f9897070acMike Reed        subclasses like SkPicture's recording canvas, that can store the data
81893d11b5b461a8677a8e3ffa94260f4f9897070acMike Reed        and then play it back later (via another call to drawData).
81993d11b5b461a8677a8e3ffa94260f4f9897070acMike Reed     */
82093d11b5b461a8677a8e3ffa94260f4f9897070acMike Reed    virtual void drawData(const void* data, size_t length);
82193d11b5b461a8677a8e3ffa94260f4f9897070acMike Reed
8220910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    //////////////////////////////////////////////////////////////////////////
82340528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger
8240910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    /** Get the current bounder object.
8250910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        The bounder's reference count is unchaged.
8260910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @return the canva's bounder (or NULL).
8270910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    */
8280910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkBounder*  getBounder() const { return fBounder; }
8290910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
8300910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    /** Set a new bounder (or NULL).
8310910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        Pass NULL to clear any previous bounder.
8320910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        As a convenience, the parameter passed is also returned.
8330910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        If a previous bounder exists, its reference count is decremented.
8340910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        If bounder is not NULL, its reference count is incremented.
8350910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param bounder the new bounder (or NULL) to be installed in the canvas
8360910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @return the set bounder object
8370910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    */
8380910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    virtual SkBounder* setBounder(SkBounder* bounder);
83940528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger
8400910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    /** Get the current filter object. The filter's reference count is not
8418f7d36c67f1bdde7ca1680857936f6af951e19e2Mike Reed        affected. The filter is saved/restored, just like the matrix and clip.
8420910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @return the canvas' filter (or NULL).
8430910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    */
8440910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkDrawFilter* getDrawFilter() const;
84540528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger
8460910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    /** Set the new filter (or NULL). Pass NULL to clear any existing filter.
8470910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        As a convenience, the parameter is returned. If an existing filter
8480910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        exists, its refcnt is decrement. If the new filter is not null, its
8498f7d36c67f1bdde7ca1680857936f6af951e19e2Mike Reed        refcnt is incremented. The filter is saved/restored, just like the
8508f7d36c67f1bdde7ca1680857936f6af951e19e2Mike Reed        matrix and clip.
8510910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param filter the new filter (or NULL)
8520910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @return the new filter
8530910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    */
8540910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    virtual SkDrawFilter* setDrawFilter(SkDrawFilter* filter);
8550910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
8560910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    //////////////////////////////////////////////////////////////////////////
8570910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
8580910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    /** Return the current matrix on the canvas.
8590910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        This does not account for the translate in any of the devices.
8600910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @return The current matrix on the canvas.
8610910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    */
8620910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    const SkMatrix& getTotalMatrix() const;
8630910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
8641cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    enum ClipType {
8651cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        kEmpty_ClipType = 0,
8661cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        kRect_ClipType,
8671cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        kComplex_ClipType
8681cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    };
8691cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
8701cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    /** Returns a description of the total clip; may be cheaper than
8711cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        getting the clip and querying it directly.
8721cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    */
8731cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    ClipType getClipType() const;
8741cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
8750910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    /** Return the current device clip (concatenation of all clip calls).
8760910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        This does not account for the translate in any of the devices.
8770910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @return the current device clip (concatenation of all clip calls).
8780910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    */
8790910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    const SkRegion& getTotalClip() const;
8800910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
88105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    /**
8821cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *  Return true if the current clip is non-empty.
8831cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *
8841cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *  If bounds is not NULL, set it to the bounds of the current clip
8851cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *  in global coordinates.
8861cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     */
8871cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    bool getTotalClipBounds(SkIRect* bounds) const;
8881cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
8891cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    /**
89005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger     *  Return the current clipstack. This mirrors the result in getTotalClip()
89105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger     *  but is represented as a stack of geometric clips + region-ops.
89205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger     */
89305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    const SkClipStack& getTotalClipStack() const;
89405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
89540528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger    void setExternalMatrix(const SkMatrix* = NULL);
8960910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
8970910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    ///////////////////////////////////////////////////////////////////////////
8980910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
8990910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    /** After calling saveLayer(), there can be any number of devices that make
9000910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        up the top-most drawing area. LayerIter can be used to iterate through
9010910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        those devices. Note that the iterator is only valid until the next API
9020910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        call made on the canvas. Ownership of all pointers in the iterator stays
9030910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        with the canvas, so none of them should be modified or deleted.
9040910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    */
905137a4ca42423bbb6d683067ea544c9a48f18f06cDerek Sollenberger    class SK_API LayerIter /*: SkNoncopyable*/ {
9060910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    public:
9070910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        /** Initialize iterator with canvas, and set values for 1st device */
9080910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        LayerIter(SkCanvas*, bool skipEmptyClips);
9090910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        ~LayerIter();
91040528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger
9110910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        /** Return true if the iterator is done */
9120910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        bool done() const { return fDone; }
9130910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        /** Cycle to the next device */
9140910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        void next();
91540528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger
9160910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        // These reflect the current device in the iterator
9170910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
9180910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        SkDevice*       device() const;
9190910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        const SkMatrix& matrix() const;
9200910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        const SkRegion& clip() const;
9210910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        const SkPaint&  paint() const;
9220910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        int             x() const;
9230910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        int             y() const;
92440528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger
9250910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    private:
9260910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        // used to embed the SkDrawIter object directly in our instance, w/o
9270910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        // having to expose that class def to the public. There is an assert
9280910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        // in our constructor to ensure that fStorage is large enough
9290910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        // (though needs to be a compile-time-assert!). We use intptr_t to work
9300910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        // safely with 32 and 64 bit machines (to ensure the storage is enough)
93140528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger        intptr_t          fStorage[32];
9320910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        class SkDrawIter* fImpl;    // this points at fStorage
9330910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        SkPaint           fDefaultPaint;
9340910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        bool              fDone;
9350910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    };
9360910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
9370910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectprotected:
9384f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger    // Returns the canvas to be used by DrawIter. Default implementation
9394f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger    // returns this. Subclasses that encapsulate an indirect canvas may
9404f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger    // need to overload this method. The impl must keep track of this, as it
9414f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger    // is not released or deleted by the caller.
9424f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger    virtual SkCanvas* canvasForDrawIter();
9434f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger
9440910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    // all of the drawBitmap variants call this guy
94540528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger    virtual void commonDrawBitmap(const SkBitmap&, const SkIRect*,
94640528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger                                  const SkMatrix&, const SkPaint& paint);
94740528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger
9484f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger    // Clip rectangle bounds. Called internally by saveLayer.
9494f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger    // returns false if the entire rectangle is entirely clipped out
9504f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger    bool clipRectBounds(const SkRect* bounds, SaveFlags flags,
9514f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger                         SkIRect* intersection);
9524f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger
9530910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectprivate:
9540910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    class MCRec;
9550910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
95671531ca1f484da5837be8017a0c83e5bff701587Derek Sollenberger    SkClipStack fClipStack;
9570910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkDeque     fMCStack;
9580910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    // points to top of stack
9590910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    MCRec*      fMCRec;
9600910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    // the first N recs that can fit here mean we won't call malloc
9610910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    uint32_t    fMCRecStorage[32];
9620910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
9630910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkBounder*  fBounder;
964f87ea139deed57504b433fc4e1bf98c85ef0da80Mike Reed    SkDevice*   fLastDeviceToGainFocus;
9651cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    int         fLayerCount;    // number of successful saveLayer calls
9660910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
96705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    void prepareForDeviceDraw(SkDevice*, const SkMatrix&, const SkRegion&,
96805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger                              const SkClipStack& clipStack);
96940528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger
9700910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    bool fDeviceCMDirty;            // cleared by updateDeviceCMCache()
9710910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    void updateDeviceCMCache();
9720910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
9730910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    friend class SkDrawIter;    // needs setupDrawForLayerDevice()
9740910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
9754f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger    SkDevice* createLayerDevice(SkBitmap::Config, int width, int height,
9761cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                bool isOpaque);
9771cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
9780910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkDevice* init(SkDevice*);
9791cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
9801cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    // internal methods are not virtual, so they can safely be called by other
9811cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    // canvas apis, without confusing subclasses (like SkPictureRecording)
98240528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger    void internalDrawBitmap(const SkBitmap&, const SkIRect*, const SkMatrix& m,
9830910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                                  const SkPaint* paint);
9841cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    void internalDrawBitmapRect(const SkBitmap& bitmap, const SkIRect* src,
9851cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                const SkRect& dst, const SkPaint* paint);
9861cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    void internalDrawBitmapNine(const SkBitmap& bitmap, const SkIRect& center,
9871cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                const SkRect& dst, const SkPaint* paint);
9881cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    void internalDrawPaint(const SkPaint& paint);
9891cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
9904f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger
9910910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    void drawDevice(SkDevice*, int x, int y, const SkPaint*);
9920910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    // shared by save() and saveLayer()
9930910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    int internalSave(SaveFlags flags);
9940910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    void internalRestore();
9951cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    static void DrawRect(const SkDraw& draw, const SkPaint& paint,
9961cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                         const SkRect& r, SkScalar textSize);
9971cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    static void DrawTextDecorations(const SkDraw& draw, const SkPaint& paint,
9981cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                    const char text[], size_t byteLength,
9991cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                    SkScalar x, SkScalar y);
100040528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger
10010910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    /*  These maintain a cache of the clip bounds in local coordinates,
10020910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        (converted to 2s-compliment if floats are slow).
10030910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project     */
10040910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    mutable SkRectCompareType fLocalBoundsCompareType;
10050910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    mutable bool              fLocalBoundsCompareTypeDirty;
10060910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
100743356962b0685a89e232a038b2b33162da04517dRomain Guy    mutable SkRectCompareType fLocalBoundsCompareTypeBW;
100843356962b0685a89e232a038b2b33162da04517dRomain Guy    mutable bool              fLocalBoundsCompareTypeDirtyBW;
100943356962b0685a89e232a038b2b33162da04517dRomain Guy
101043356962b0685a89e232a038b2b33162da04517dRomain Guy    /* Get the local clip bounds with an anti-aliased edge.
101143356962b0685a89e232a038b2b33162da04517dRomain Guy     */
10120910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    const SkRectCompareType& getLocalClipBoundsCompareType() const {
101343356962b0685a89e232a038b2b33162da04517dRomain Guy        return getLocalClipBoundsCompareType(kAA_EdgeType);
101443356962b0685a89e232a038b2b33162da04517dRomain Guy    }
101543356962b0685a89e232a038b2b33162da04517dRomain Guy
101643356962b0685a89e232a038b2b33162da04517dRomain Guy    const SkRectCompareType& getLocalClipBoundsCompareType(EdgeType et) const {
101743356962b0685a89e232a038b2b33162da04517dRomain Guy        if (et == kAA_EdgeType) {
101843356962b0685a89e232a038b2b33162da04517dRomain Guy            if (fLocalBoundsCompareTypeDirty) {
101943356962b0685a89e232a038b2b33162da04517dRomain Guy                this->computeLocalClipBoundsCompareType(et);
102043356962b0685a89e232a038b2b33162da04517dRomain Guy                fLocalBoundsCompareTypeDirty = false;
102143356962b0685a89e232a038b2b33162da04517dRomain Guy            }
102243356962b0685a89e232a038b2b33162da04517dRomain Guy            return fLocalBoundsCompareType;
102343356962b0685a89e232a038b2b33162da04517dRomain Guy        } else {
102443356962b0685a89e232a038b2b33162da04517dRomain Guy            if (fLocalBoundsCompareTypeDirtyBW) {
102543356962b0685a89e232a038b2b33162da04517dRomain Guy                this->computeLocalClipBoundsCompareType(et);
102643356962b0685a89e232a038b2b33162da04517dRomain Guy                fLocalBoundsCompareTypeDirtyBW = false;
102743356962b0685a89e232a038b2b33162da04517dRomain Guy            }
102843356962b0685a89e232a038b2b33162da04517dRomain Guy            return fLocalBoundsCompareTypeBW;
10290910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        }
10300910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    }
103143356962b0685a89e232a038b2b33162da04517dRomain Guy    void computeLocalClipBoundsCompareType(EdgeType et) const;
103240528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger
103340528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger    SkMatrix    fExternalMatrix, fExternalInverse;
103440528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger    bool        fUseExternalMatrix;
103571531ca1f484da5837be8017a0c83e5bff701587Derek Sollenberger
103671531ca1f484da5837be8017a0c83e5bff701587Derek Sollenberger    class AutoValidateClip : ::SkNoncopyable {
103771531ca1f484da5837be8017a0c83e5bff701587Derek Sollenberger    public:
103871531ca1f484da5837be8017a0c83e5bff701587Derek Sollenberger        explicit AutoValidateClip(SkCanvas* canvas) : fCanvas(canvas) {
103971531ca1f484da5837be8017a0c83e5bff701587Derek Sollenberger            fCanvas->validateClip();
104071531ca1f484da5837be8017a0c83e5bff701587Derek Sollenberger        }
104171531ca1f484da5837be8017a0c83e5bff701587Derek Sollenberger        ~AutoValidateClip() { fCanvas->validateClip(); }
104271531ca1f484da5837be8017a0c83e5bff701587Derek Sollenberger
104371531ca1f484da5837be8017a0c83e5bff701587Derek Sollenberger    private:
104471531ca1f484da5837be8017a0c83e5bff701587Derek Sollenberger        const SkCanvas* fCanvas;
104571531ca1f484da5837be8017a0c83e5bff701587Derek Sollenberger    };
104671531ca1f484da5837be8017a0c83e5bff701587Derek Sollenberger
104771531ca1f484da5837be8017a0c83e5bff701587Derek Sollenberger#ifdef SK_DEBUG
104871531ca1f484da5837be8017a0c83e5bff701587Derek Sollenberger    void validateClip() const;
104971531ca1f484da5837be8017a0c83e5bff701587Derek Sollenberger#else
105071531ca1f484da5837be8017a0c83e5bff701587Derek Sollenberger    void validateClip() const {}
105171531ca1f484da5837be8017a0c83e5bff701587Derek Sollenberger#endif
10520910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project};
10530910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
10540910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project/** Stack helper class to automatically call restoreToCount() on the canvas
10550910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    when this object goes out of scope. Use this to guarantee that the canvas
10560910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    is restored to a known state.
10570910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project*/
10580910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectclass SkAutoCanvasRestore : SkNoncopyable {
10590910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectpublic:
10600910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkAutoCanvasRestore(SkCanvas* canvas, bool doSave) : fCanvas(canvas) {
10610910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        SkASSERT(canvas);
10620910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        fSaveCount = canvas->getSaveCount();
10630910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        if (doSave) {
10640910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            canvas->save();
10650910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        }
10660910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    }
10670910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    ~SkAutoCanvasRestore() {
10680910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        fCanvas->restoreToCount(fSaveCount);
10690910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    }
10700910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
10710910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectprivate:
10720910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkCanvas*   fCanvas;
10730910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    int         fSaveCount;
10740910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project};
10750910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
10760910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#endif
1077