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