11cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
20910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project/*
31cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * Copyright 2010 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 SkDevice_DEFINED
110910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define SkDevice_DEFINED
120910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
130910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkRefCnt.h"
140910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkBitmap.h"
150910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkCanvas.h"
160910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkColor.h"
170910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1871531ca1f484da5837be8017a0c83e5bff701587Derek Sollenbergerclass SkClipStack;
190910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectclass SkDraw;
200910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectstruct SkIRect;
210910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectclass SkMatrix;
2287b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenbergerclass SkMetaData;
230910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectclass SkRegion;
240910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
251cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger// This is an opaque class, not interpreted by skia
261cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerclass SkGpuRenderTarget;
2720ab88413000fcc8668eeab25d9cb714097d0c45tedbo
28137a4ca42423bbb6d683067ea544c9a48f18f06cDerek Sollenbergerclass SK_API SkDevice : public SkRefCnt {
290910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectpublic:
301cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    /**
311cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *  Construct a new device with the specified bitmap as its backend. It is
321cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *  valid for the bitmap to have no pixels associated with it. In that case,
331cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *  any drawing to this device will have no effect.
341cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    */
351cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    SkDevice(const SkBitmap& bitmap);
3640528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger
371cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    /**
381cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *  Create a new raster device and have the pixels be automatically
391cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *  allocated. The rowBytes of the device will be computed automatically
401cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *  based on the config and the width.
411cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *
421cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *  @param config   The desired config for the pixels. If the request cannot
431cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *                  be met, the closest matching support config will be used.
441cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *  @param width    width (in pixels) of the device
451cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *  @param height   height (in pixels) of the device
461cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *  @param isOpaque Set to true if it is known that all of the pixels will
471cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *                  be drawn to opaquely. Used as an accelerator when drawing
481cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *                  these pixels to another device.
491cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     */
501cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    SkDevice(SkBitmap::Config config, int width, int height, bool isOpaque = false);
5120ab88413000fcc8668eeab25d9cb714097d0c45tedbo
5287b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger    virtual ~SkDevice();
530910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
5435e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger    /**
551cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *  Creates a device that is of the same type as this device (e.g. SW-raster,
561cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *  GPU, or PDF). The backing store for this device is created automatically
571cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *  (e.g. offscreen pixels or FBO or whatever is appropriate).
581cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *
591cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *  @param width    width of the device to create
601cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *  @param height   height of the device to create
611cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *  @param isOpaque performance hint, set to true if you know that you will
621cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *                  draw into this device such that all of the pixels will
631cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *                  be opaque.
6435e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger     */
654f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger    SkDevice* createCompatibleDevice(SkBitmap::Config config,
661cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                     int width, int height,
671cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                     bool isOpaque);
681cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
691cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    SkMetaData& getMetaData();
7020ab88413000fcc8668eeab25d9cb714097d0c45tedbo
7120ab88413000fcc8668eeab25d9cb714097d0c45tedbo    enum Capabilities {
7220ab88413000fcc8668eeab25d9cb714097d0c45tedbo        kGL_Capability     = 0x1,  //!< mask indicating GL support
7320ab88413000fcc8668eeab25d9cb714097d0c45tedbo        kVector_Capability = 0x2,  //!< mask indicating a vector representation
7420ab88413000fcc8668eeab25d9cb714097d0c45tedbo        kAll_Capabilities  = 0x3
7520ab88413000fcc8668eeab25d9cb714097d0c45tedbo    };
7620ab88413000fcc8668eeab25d9cb714097d0c45tedbo    virtual uint32_t getDeviceCapabilities() { return 0; }
7720ab88413000fcc8668eeab25d9cb714097d0c45tedbo
780910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    /** Return the width of the device (in pixels).
790910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    */
8040528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger    virtual int width() const { return fBitmap.width(); }
810910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    /** Return the height of the device (in pixels).
820910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    */
8340528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger    virtual int height() const { return fBitmap.height(); }
8405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
8505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    /**
861cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *  Return the bounds of the device in the coordinate space of the root
871cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *  canvas. The root device will have its top-left at 0,0, but other devices
881cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *  such as those associated with saveLayer may have a non-zero origin.
8905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger     */
901cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    void getGlobalBounds(SkIRect* bounds) const;
9105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
920910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    /** Returns true if the device's bitmap's config treats every pixels as
930910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        implicitly opaque.
940910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    */
950910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    bool isOpaque() const { return fBitmap.isOpaque(); }
9640528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger
971cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    /** Return the bitmap config of the device's pixels
980910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    */
991cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    SkBitmap::Config config() const { return fBitmap.getConfig(); }
1000910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1010910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    /** Return the bitmap associated with this device. Call this each time you need
1020910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        to access the bitmap, as it notifies the subclass to perform any flushing
1030910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        etc. before you examine the pixels.
1040910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param changePixels set to true if the caller plans to change the pixels
1050910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @return the device's bitmap
1060910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    */
1070910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    const SkBitmap& accessBitmap(bool changePixels);
1080910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1091cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    /**
1101cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *  DEPRECATED: This will be made protected once WebKit stops using it.
1111cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *              Instead use Canvas' writePixels method.
1121cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *
1131cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *  Similar to draw sprite, this method will copy the pixels in bitmap onto
1141cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *  the device, with the top/left corner specified by (x, y). The pixel
1151cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *  values in the device are completely replaced: there is no blending.
1161cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *
1171cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *  Currently if bitmap is backed by a texture this is a no-op. This may be
1181cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *  relaxed in the future.
1191cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *
1201cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *  If the bitmap has config kARGB_8888_Config then the config8888 param
1211cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *  will determines how the pixel valuess are intepreted. If the bitmap is
1221cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *  not kARGB_8888_Config then this parameter is ignored.
12335e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger     */
1241cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    virtual void writePixels(const SkBitmap& bitmap, int x, int y,
1251cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                             SkCanvas::Config8888 config8888 = SkCanvas::kNative_Premul_Config8888);
12635e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger
12735e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger    /**
1281cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * Return the device's associated gpu render target, or NULL.
12935e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger     */
1301cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    virtual SkGpuRenderTarget* accessRenderTarget() { return NULL; }
1310910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1320910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1331cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    /**
1341cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *  Return the device's origin: its offset in device coordinates from
1351cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *  the default origin in its canvas' matrix/clip
1361cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     */
1371cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    const SkIPoint& getOrigin() const { return fOrigin; }
1381cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
1391cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerprotected:
1401cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    enum Usage {
1411cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger       kGeneral_Usage,
1421cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger       kSaveLayer_Usage, // <! internal use only
1431cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    };
1441cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
1451cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    struct TextFlags {
1461cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        uint32_t            fFlags;     // SkPaint::getFlags()
1471cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        SkPaint::Hinting    fHinting;
1481cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    };
1491cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
1501cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    /**
1511cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *  Device may filter the text flags for drawing text here. If it wants to
1521cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *  make a change to the specified values, it should write them into the
1531cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *  textflags parameter (output) and return true. If the paint is fine as
1541cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *  is, then ignore the textflags parameter and return false.
1551cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *
1561cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *  The baseclass SkDevice filters based on its depth and blitters.
15740528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger     */
1581cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    virtual bool filterTextFlags(const SkPaint& paint, TextFlags*);
15940528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger
16071531ca1f484da5837be8017a0c83e5bff701587Derek Sollenberger    /**
16171531ca1f484da5837be8017a0c83e5bff701587Derek Sollenberger     *  Called with the correct matrix and clip before this device is drawn
16271531ca1f484da5837be8017a0c83e5bff701587Derek Sollenberger     *  to using those settings. If your subclass overrides this, be sure to
16371531ca1f484da5837be8017a0c83e5bff701587Derek Sollenberger     *  call through to the base class as well.
16471531ca1f484da5837be8017a0c83e5bff701587Derek Sollenberger     *
16571531ca1f484da5837be8017a0c83e5bff701587Derek Sollenberger     *  The clipstack is another view of the clip. It records the actual
16671531ca1f484da5837be8017a0c83e5bff701587Derek Sollenberger     *  geometry that went into building the region. It is present for devices
16771531ca1f484da5837be8017a0c83e5bff701587Derek Sollenberger     *  that want to parse it, but is not required: the region is a complete
16871531ca1f484da5837be8017a0c83e5bff701587Derek Sollenberger     *  picture of the current clip. (i.e. if you regionize all of the geometry
16971531ca1f484da5837be8017a0c83e5bff701587Derek Sollenberger     *  in the clipstack, you will arrive at an equivalent region to the one
17071531ca1f484da5837be8017a0c83e5bff701587Derek Sollenberger     *  passed in).
1710910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    */
17271531ca1f484da5837be8017a0c83e5bff701587Derek Sollenberger    virtual void setMatrixClip(const SkMatrix&, const SkRegion&,
17371531ca1f484da5837be8017a0c83e5bff701587Derek Sollenberger                               const SkClipStack&);
1740910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1750910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    /** Called when this device gains focus (i.e becomes the current device
1760910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        for drawing).
1770910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    */
17805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    virtual void gainFocus(SkCanvas*, const SkMatrix&, const SkRegion&,
17905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger                           const SkClipStack&) {}
18040528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger
1811cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    /** Clears the entire device to the specified color (including alpha).
1821cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *  Ignores the clip.
18340528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger     */
1841cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    virtual void clear(SkColor color);
18540528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger
18640528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger    /**
1871cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * Deprecated name for clear.
18840528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger     */
1891cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    void eraseColor(SkColor eraseColor) { this->clear(eraseColor); }
1900910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1910910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    /** These are called inside the per-device-layer loop for each draw call.
1920910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project     When these are called, we have already applied any saveLayer operations,
1930910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project     and are handling any looping from the paint, and any effects from the
1940910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project     DrawFilter.
1950910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project     */
1960910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    virtual void drawPaint(const SkDraw&, const SkPaint& paint);
1970910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    virtual void drawPoints(const SkDraw&, SkCanvas::PointMode mode, size_t count,
1980910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                            const SkPoint[], const SkPaint& paint);
1990910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    virtual void drawRect(const SkDraw&, const SkRect& r,
2000910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                          const SkPaint& paint);
20187b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger    /**
20287b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger     *  If pathIsMutable, then the implementation is allowed to cast path to a
20387b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger     *  non-const pointer and modify it in place (as an optimization). Canvas
20487b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger     *  may do this to implement helpers such as drawOval, by placing a temp
20587b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger     *  path on the stack to hold the representation of the oval.
20687b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger     *
20787b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger     *  If prePathMatrix is not null, it should logically be applied before any
20887b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger     *  stroking or other effects. If there are no effects on the paint that
20987b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger     *  affect the geometry/rasterization, then the pre matrix can just be
21087b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger     *  pre-concated with the current matrix.
21187b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger     */
2120910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    virtual void drawPath(const SkDraw&, const SkPath& path,
21340528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger                          const SkPaint& paint,
21440528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger                          const SkMatrix* prePathMatrix = NULL,
21540528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger                          bool pathIsMutable = false);
2160910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    virtual void drawBitmap(const SkDraw&, const SkBitmap& bitmap,
21740528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger                            const SkIRect* srcRectOrNull,
2180910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                            const SkMatrix& matrix, const SkPaint& paint);
2190910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    virtual void drawSprite(const SkDraw&, const SkBitmap& bitmap,
2200910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                            int x, int y, const SkPaint& paint);
2211cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    /**
2221cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *  Does not handle text decoration.
2231cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *  Decorations (underline and stike-thru) will be handled by SkCanvas.
2241cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     */
2250910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    virtual void drawText(const SkDraw&, const void* text, size_t len,
2260910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                          SkScalar x, SkScalar y, const SkPaint& paint);
2270910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    virtual void drawPosText(const SkDraw&, const void* text, size_t len,
2280910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                             const SkScalar pos[], SkScalar constY,
2290910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                             int scalarsPerPos, const SkPaint& paint);
2300910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    virtual void drawTextOnPath(const SkDraw&, const void* text, size_t len,
2310910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                                const SkPath& path, const SkMatrix* matrix,
2320910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                                const SkPaint& paint);
2331cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#ifdef SK_BUILD_FOR_ANDROID
234a2dfb00239c367c3663e8487a8213d0edad238baAndreas Borglin    virtual void drawPosTextOnPath(const SkDraw& draw, const void* text, size_t len,
235a2dfb00239c367c3663e8487a8213d0edad238baAndreas Borglin                                   const SkPoint pos[], const SkPaint& paint,
236a2dfb00239c367c3663e8487a8213d0edad238baAndreas Borglin                                   const SkPath& path, const SkMatrix* matrix);
23705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger#endif
2380910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    virtual void drawVertices(const SkDraw&, SkCanvas::VertexMode, int vertexCount,
2390910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                              const SkPoint verts[], const SkPoint texs[],
2400910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                              const SkColor colors[], SkXfermode* xmode,
2410910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                              const uint16_t indices[], int indexCount,
2420910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                              const SkPaint& paint);
2431cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    /** The SkDevice passed will be an SkDevice which was returned by a call to
2441cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        onCreateCompatibleDevice on this device with kSaveLayer_Usage.
2451cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     */
2460910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    virtual void drawDevice(const SkDraw&, SkDevice*, int x, int y,
2470910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                            const SkPaint&);
2480910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
249137a4ca42423bbb6d683067ea544c9a48f18f06cDerek Sollenberger    /**
2501cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *  On success (returns true), copy the device pixels into the bitmap.
2511cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *  On failure, the bitmap parameter is left unchanged and false is
2521cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *  returned.
253137a4ca42423bbb6d683067ea544c9a48f18f06cDerek Sollenberger     *
2541cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *  The device's pixels are converted to the bitmap's config. The only
2551cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *  supported config is kARGB_8888_Config, though this is likely to be
2561cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *  relaxed in  the future. The meaning of config kARGB_8888_Config is
2571cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *  modified by the enum param config8888. The default value interprets
2581cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *  kARGB_8888_Config as SkPMColor
2591cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *
2601cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *  If the bitmap has pixels already allocated, the device pixels will be
2614f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger     *  written there. If not, bitmap->allocPixels() will be called
2621cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *  automatically. If the bitmap is backed by a texture readPixels will
2631cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *  fail.
2641cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *
2651cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *  The actual pixels written is the intersection of the device's bounds,
2661cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *  and the rectangle formed by the bitmap's width,height and the specified
2671cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *  x,y. If bitmap pixels extend outside of that intersection, they will not
2681cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *  be modified.
2691cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *
2701cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *  Other failure conditions:
2711cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *    * If the device is not a raster device (e.g. PDF) then readPixels will
2721cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *      fail.
2731cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *    * If bitmap is texture-backed then readPixels will fail. (This may be
2741cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *      relaxed in the future.)
275137a4ca42423bbb6d683067ea544c9a48f18f06cDerek Sollenberger     */
2761cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    bool readPixels(SkBitmap* bitmap,
2771cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                    int x, int y,
2781cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                    SkCanvas::Config8888 config8888);
279137a4ca42423bbb6d683067ea544c9a48f18f06cDerek Sollenberger
2801cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    ///////////////////////////////////////////////////////////////////////////
28135e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger
2824f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger    /** Update as needed the pixel value in the bitmap, so that the caller can
2834f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger        access the pixels directly. Note: only the pixels field should be
2844f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger        altered. The config/width/height/rowbytes must remain unchanged.
2854f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger        @param bitmap The device's bitmap
2864f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger        @return Echo the bitmap parameter, or an alternate (shadow) bitmap
2874f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger            maintained by the subclass.
2880910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    */
2894f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger    virtual const SkBitmap& onAccessBitmap(SkBitmap*);
2900910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
29140528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger    SkPixelRef* getPixelRef() const { return fBitmap.pixelRef(); }
29240528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger    // just for subclasses, to assign a custom pixelref
29340528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger    SkPixelRef* setPixelRef(SkPixelRef* pr, size_t offset) {
29440528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger        fBitmap.setPixelRef(pr, offset);
29540528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger        return pr;
29640528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger    }
2974f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger
2981cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    /**
2991cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * Implements readPixels API. The caller will ensure that:
3001cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *  1. bitmap has pixel config kARGB_8888_Config.
3011cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *  2. bitmap has pixels.
3021cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *  3. The rectangle (x, y, x + bitmap->width(), y + bitmap->height()) is
3031cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *     contained in the device bounds.
3041cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     */
3051cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    virtual bool onReadPixels(const SkBitmap& bitmap,
3061cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                              int x, int y,
3071cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                              SkCanvas::Config8888 config8888);
3081cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
3091cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    /** Called when this device is installed into a Canvas. Balanaced by a call
3101cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        to unlockPixels() when the device is removed from a Canvas.
3111cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    */
3121cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    virtual void lockPixels();
3131cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    virtual void unlockPixels();
3141cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
3151cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    /**
3161cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *  Returns true if the device allows processing of this imagefilter. If
3171cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *  false is returned, then the filter is ignored. This may happen for
3181cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *  some subclasses that do not support pixel manipulations after drawing
3191cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *  has occurred (e.g. printing). The default implementation returns true.
3201cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     */
3211cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    virtual bool allowImageFilter(SkImageFilter*);
3221cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
3231cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    /**
3241cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *  Override and return true for filters that the device handles
3251cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *  intrinsically. Returning false means call the filter.
3261cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *  Default impl returns false. This will only be called if allowImageFilter()
3271cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *  returned true.
3281cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     */
3291cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    virtual bool filterImage(SkImageFilter*, const SkBitmap& src,
3301cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                             const SkMatrix& ctm,
3311cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                             SkBitmap* result, SkIPoint* offset);
3321cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
3334f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger    // This is equal kBGRA_Premul_Config8888 or kRGBA_Premul_Config8888 if
3341cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    // either is identical to kNative_Premul_Config8888. Otherwise, -1.
3351cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    static const SkCanvas::Config8888 kPMColorAlias;
33640528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger
3370910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectprivate:
33805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    friend class SkCanvas;
3391cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    friend struct DeviceCM; //for setMatrixClip
3401cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    friend class SkDraw;
3411cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    friend class SkDrawIter;
3421cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    friend class SkDeviceFilteredPaint;
3431cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    friend class DeviceImageFilterProxy;
3441cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
34505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    // just called by SkCanvas when built as a layer
34605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    void setOrigin(int x, int y) { fOrigin.set(x, y); }
3471cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    // just called by SkCanvas for saveLayer
3484f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger    SkDevice* createCompatibleDeviceForSaveLayer(SkBitmap::Config config,
3491cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                                 int width, int height,
3501cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                                 bool isOpaque);
3511cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
3521cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    /**
3531cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * Subclasses should override this to implement createCompatibleDevice.
3541cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     */
3554f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger    virtual SkDevice* onCreateCompatibleDevice(SkBitmap::Config config,
3564f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger                                               int width, int height,
3571cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                               bool isOpaque,
3581cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                               Usage usage);
3591cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
3601cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    /** Causes any deferred drawing to the device to be completed.
3611cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     */
3621cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    virtual void flush() {}
36305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
36440528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger    SkBitmap    fBitmap;
36505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    SkIPoint    fOrigin;
36687b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger    SkMetaData* fMetaData;
3670910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project};
3680910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
3690910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#endif
370