SkCanvas.h revision 137a4ca42423bbb6d683067ea544c9a48f18f06c
10910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project/* 20910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project * Copyright (C) 2006 The Android Open Source Project 30910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project * 40910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 50910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project * you may not use this file except in compliance with the License. 60910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project * You may obtain a copy of the License at 70910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project * 80910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 90910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project * 100910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 110910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 120910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 130910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project * See the License for the specific language governing permissions and 140910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project * limitations under the License. 150910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project */ 160910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 170910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#ifndef SkCanvas_DEFINED 180910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define SkCanvas_DEFINED 190910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 200910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkTypes.h" 210910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkBitmap.h" 220910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkDeque.h" 2371531ca1f484da5837be8017a0c83e5bff701587Derek Sollenberger#include "SkClipStack.h" 240910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkPaint.h" 250910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkRefCnt.h" 260910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkPath.h" 270910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkRegion.h" 280910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkScalarCompare.h" 2959f59bde0b05a6ac5ff28fdebc1942dbf0d43aabMike Reed#include "SkXfermode.h" 300910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 310910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectclass SkBounder; 320910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectclass SkDevice; 3320ab88413000fcc8668eeab25d9cb714097d0c45tedboclass SkDeviceFactory; 340910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectclass SkDraw; 350910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectclass SkDrawFilter; 360910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectclass SkPicture; 37dab163f0b2658c2dba48839e72f81d3d8ee0ae8bMike Reedclass SkShape; 380910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 390910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project/** \class SkCanvas 400910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 410910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project A Canvas encapsulates all of the state about drawing into a device (bitmap). 420910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project This includes a reference to the device itself, and a stack of matrix/clip 430910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project values. For any given draw call (e.g. drawRect), the geometry of the object 440910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project being drawn is transformed by the concatenation of all the matrices in the 450910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project stack. The transformed geometry is clipped by the intersection of all of 460910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project the clips in the stack. 470910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 480910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project While the Canvas holds the state of the drawing device, the state (style) 490910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project of the object being drawn is held by the Paint, which is provided as a 500910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project parameter to each of the draw() methods. The Paint holds attributes such as 510910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project color, typeface, textSize, strokeWidth, shader (e.g. gradients, patterns), 520910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project etc. 530910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project*/ 54137a4ca42423bbb6d683067ea544c9a48f18f06cDerek Sollenbergerclass SK_API SkCanvas : public SkRefCnt { 550910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectpublic: 5620ab88413000fcc8668eeab25d9cb714097d0c45tedbo /** Construct a canvas with the given device factory. 5720ab88413000fcc8668eeab25d9cb714097d0c45tedbo @param factory Specify the factory for generating additional devices. 5820ab88413000fcc8668eeab25d9cb714097d0c45tedbo The factory may be null, in which case 5920ab88413000fcc8668eeab25d9cb714097d0c45tedbo SkRasterDeviceFactory will be used. 6020ab88413000fcc8668eeab25d9cb714097d0c45tedbo */ 6120ab88413000fcc8668eeab25d9cb714097d0c45tedbo explicit SkCanvas(SkDeviceFactory* factory = NULL); 6220ab88413000fcc8668eeab25d9cb714097d0c45tedbo 6320ab88413000fcc8668eeab25d9cb714097d0c45tedbo /** Construct a canvas with the specified device to draw into. The device 6420ab88413000fcc8668eeab25d9cb714097d0c45tedbo factory will be retrieved from the passed device. 6520ab88413000fcc8668eeab25d9cb714097d0c45tedbo @param device Specifies a device for the canvas to draw into. 6620ab88413000fcc8668eeab25d9cb714097d0c45tedbo */ 6720ab88413000fcc8668eeab25d9cb714097d0c45tedbo explicit SkCanvas(SkDevice* device); 6820ab88413000fcc8668eeab25d9cb714097d0c45tedbo 6920ab88413000fcc8668eeab25d9cb714097d0c45tedbo /** Deprecated - Construct a canvas with the specified bitmap to draw into. 700910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project @param bitmap Specifies a bitmap for the canvas to draw into. Its 710910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project structure are copied to the canvas. 720910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project */ 730910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project explicit SkCanvas(const SkBitmap& bitmap); 740910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project virtual ~SkCanvas(); 750910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 760910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project /////////////////////////////////////////////////////////////////////////// 770910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 7820ab88413000fcc8668eeab25d9cb714097d0c45tedbo /** If the Device supports GL viewports, return true and set size (if not 7920ab88413000fcc8668eeab25d9cb714097d0c45tedbo null) to the size of the viewport. If it is not supported, ignore size 8020ab88413000fcc8668eeab25d9cb714097d0c45tedbo and return false. 810910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project */ 820910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project virtual bool getViewport(SkIPoint* size) const; 8320ab88413000fcc8668eeab25d9cb714097d0c45tedbo 8420ab88413000fcc8668eeab25d9cb714097d0c45tedbo /** If the Device supports GL viewports, return true and set the viewport 8520ab88413000fcc8668eeab25d9cb714097d0c45tedbo to the specified x and y dimensions. If it is not supported, ignore x 8620ab88413000fcc8668eeab25d9cb714097d0c45tedbo and y and return false. 870910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project */ 880910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project virtual bool setViewport(int x, int y); 890910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 900910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project /** Return the canvas' device object, which may be null. The device holds 910910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project the bitmap of the pixels that the canvas draws into. The reference count 920910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project of the returned device is not changed by this call. 930910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project */ 940910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkDevice* getDevice() const; 950910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 960910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project /** Specify a device for this canvas to draw into. If it is not null, its 970910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project reference count is incremented. If the canvas was already holding a 980910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project device, its reference count is decremented. The new device is returned. 990910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project */ 1000910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkDevice* setDevice(SkDevice* device); 10120ab88413000fcc8668eeab25d9cb714097d0c45tedbo 10240528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger /** May be overridden by subclasses. This returns a compatible device 10340528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger for this canvas, with the specified config/width/height. If the device 10440528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger is raster, the pixels will be allocated automatically. 10540528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger */ 10640528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger virtual SkDevice* createDevice(SkBitmap::Config, int width, int height, 10740528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger bool isOpaque, bool forLayer = false); 10840528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger 10940528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger /** 11040528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger * Create a new raster device and make it current. This also returns 11140528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger * the new device. 11240528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger */ 11340528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger SkDevice* setBitmapDevice(const SkBitmap& bitmap, bool forLayer = false); 11440528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger 11540528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger /** 11640528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger * Return the current device factory, or NULL. 11740528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger */ 11840528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger SkDeviceFactory* getDeviceFactory() const { return fDeviceFactory; } 11940528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger 12040528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger /** 12140528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger * Replace any existing factory with the specified factory. 12240528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger */ 12340528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger SkDeviceFactory* setDeviceFactory(SkDeviceFactory*); 12440528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger 12540528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger /////////////////////////////////////////////////////////////////////////// 12640528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger 12740528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger /** 12840528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger * Copy the pixels from the device into bitmap. Returns true on success. 12940528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger * If false is returned, then the bitmap parameter is left unchanged. 13040528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger * The bitmap parameter is treated as output-only, and will be completely 13140528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger * overwritten (if the method returns true). 13240528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger */ 13340528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger bool readPixels(const SkIRect& srcRect, SkBitmap* bitmap); 13440528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger bool readPixels(SkBitmap* bitmap); 13540528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger 13640528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger /** 13740528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger * Similar to draw sprite, this method will copy the pixels in bitmap onto 13840528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger * the device, with the top/left corner specified by (x, y). The pixel 13940528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger * values in the device are completely replaced: there is no blending. 14040528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger */ 14140528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger void writePixels(const SkBitmap& bitmap, int x, int y); 1420910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 1430910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project /////////////////////////////////////////////////////////////////////////// 14420ab88413000fcc8668eeab25d9cb714097d0c45tedbo 1450910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project enum SaveFlags { 1460910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project /** save the matrix state, restoring it on restore() */ 1470910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project kMatrix_SaveFlag = 0x01, 1480910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project /** save the clip state, restoring it on restore() */ 1490910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project kClip_SaveFlag = 0x02, 1500910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project /** the layer needs to support per-pixel alpha */ 1510910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project kHasAlphaLayer_SaveFlag = 0x04, 1520910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project /** the layer needs to support 8-bits per color component */ 1530910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project kFullColorLayer_SaveFlag = 0x08, 1540910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project /** the layer should clip against the bounds argument */ 1550910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project kClipToLayer_SaveFlag = 0x10, 1560910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 1570910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project // helper masks for common choices 1580910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project kMatrixClip_SaveFlag = 0x03, 1590910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project kARGB_NoClipLayer_SaveFlag = 0x0F, 1600910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project kARGB_ClipLayer_SaveFlag = 0x1F 1610910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project }; 1620910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 1638f7d36c67f1bdde7ca1680857936f6af951e19e2Mike Reed /** This call saves the current matrix, clip, and drawFilter, and pushes a 1640910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project copy onto a private stack. Subsequent calls to translate, scale, 1658f7d36c67f1bdde7ca1680857936f6af951e19e2Mike Reed rotate, skew, concat or clipRect, clipPath, and setDrawFilter all 1668f7d36c67f1bdde7ca1680857936f6af951e19e2Mike Reed operate on this copy. 1678f7d36c67f1bdde7ca1680857936f6af951e19e2Mike Reed When the balancing call to restore() is made, the previous matrix, clip, 1688f7d36c67f1bdde7ca1680857936f6af951e19e2Mike Reed and drawFilter are restored. 1690910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project @return The value to pass to restoreToCount() to balance this save() 1700910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project */ 1710910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project virtual int save(SaveFlags flags = kMatrixClip_SaveFlag); 1720910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 1730910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project /** This behaves the same as save(), but in addition it allocates an 1740910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project offscreen bitmap. All drawing calls are directed there, and only when 1750910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project the balancing call to restore() is made is that offscreen transfered to 1768f7d36c67f1bdde7ca1680857936f6af951e19e2Mike Reed the canvas (or the previous layer). 17740528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger @param bounds (may be null) This rect, if non-null, is used as a hint to 17840528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger limit the size of the offscreen, and thus drawing may be 17940528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger clipped to it, though that clipping is not guaranteed to 18040528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger happen. If exact clipping is desired, use clipRect(). 1810910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project @param paint (may be null) This is copied, and is applied to the 1820910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project offscreen when restore() is called 1830910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project @param flags LayerFlags 1840910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project @return The value to pass to restoreToCount() to balance this save() 1850910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project */ 1860910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project virtual int saveLayer(const SkRect* bounds, const SkPaint* paint, 1870910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SaveFlags flags = kARGB_ClipLayer_SaveFlag); 1880910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 1890910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project /** This behaves the same as save(), but in addition it allocates an 1900910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project offscreen bitmap. All drawing calls are directed there, and only when 1910910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project the balancing call to restore() is made is that offscreen transfered to 1928f7d36c67f1bdde7ca1680857936f6af951e19e2Mike Reed the canvas (or the previous layer). 19340528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger @param bounds (may be null) This rect, if non-null, is used as a hint to 19440528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger limit the size of the offscreen, and thus drawing may be 19540528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger clipped to it, though that clipping is not guaranteed to 19640528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger happen. If exact clipping is desired, use clipRect(). 1970910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project @param alpha This is applied to the offscreen when restore() is called. 1980910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project @param flags LayerFlags 1990910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project @return The value to pass to restoreToCount() to balance this save() 2000910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project */ 2010910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project int saveLayerAlpha(const SkRect* bounds, U8CPU alpha, 2020910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SaveFlags flags = kARGB_ClipLayer_SaveFlag); 2030910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 2040910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project /** This call balances a previous call to save(), and is used to remove all 2058f7d36c67f1bdde7ca1680857936f6af951e19e2Mike Reed modifications to the matrix/clip/drawFilter state since the last save 2068f7d36c67f1bdde7ca1680857936f6af951e19e2Mike Reed call. 2078f7d36c67f1bdde7ca1680857936f6af951e19e2Mike Reed It is an error to call restore() more times than save() was called. 2080910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project */ 2090910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project virtual void restore(); 2100910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 2110910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project /** Returns the number of matrix/clip states on the SkCanvas' private stack. 2120910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project This will equal # save() calls - # restore() calls. 2130910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project */ 2140910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project int getSaveCount() const; 2150910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 2160910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project /** Efficient way to pop any calls to save() that happened after the save 2170910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project count reached saveCount. It is an error for saveCount to be less than 2180910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project getSaveCount() 2190910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project @param saveCount The number of save() levels to restore from 2200910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project */ 2210910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project void restoreToCount(int saveCount); 2220910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 2230910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project /** Preconcat the current matrix with the specified translation 2240910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project @param dx The distance to translate in X 2250910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project @param dy The distance to translate in Y 2260910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project returns true if the operation succeeded (e.g. did not overflow) 2270910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project */ 2280910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project virtual bool translate(SkScalar dx, SkScalar dy); 2290910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 2300910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project /** Preconcat the current matrix with the specified scale. 2310910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project @param sx The amount to scale in X 2320910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project @param sy The amount to scale in Y 2330910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project returns true if the operation succeeded (e.g. did not overflow) 2340910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project */ 2350910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project virtual bool scale(SkScalar sx, SkScalar sy); 2360910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 2370910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project /** Preconcat the current matrix with the specified rotation. 2380910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project @param degrees The amount to rotate, in degrees 2390910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project returns true if the operation succeeded (e.g. did not overflow) 2400910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project */ 2410910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project virtual bool rotate(SkScalar degrees); 2420910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 2430910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project /** Preconcat the current matrix with the specified skew. 2440910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project @param sx The amount to skew in X 2450910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project @param sy The amount to skew in Y 2460910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project returns true if the operation succeeded (e.g. did not overflow) 2470910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project */ 2480910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project virtual bool skew(SkScalar sx, SkScalar sy); 2490910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 2500910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project /** Preconcat the current matrix with the specified matrix. 2510910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project @param matrix The matrix to preconcatenate with the current matrix 2520910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project @return true if the operation succeeded (e.g. did not overflow) 2530910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project */ 2540910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project virtual bool concat(const SkMatrix& matrix); 25540528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger 2560910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project /** Replace the current matrix with a copy of the specified matrix. 2570910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project @param matrix The matrix that will be copied into the current matrix. 2580910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project */ 2590910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project virtual void setMatrix(const SkMatrix& matrix); 26040528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger 2610910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project /** Helper for setMatrix(identity). Sets the current matrix to identity. 2620910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project */ 2630910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project void resetMatrix(); 2640910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 2650910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project /** Modify the current clip with the specified rectangle. 2660910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project @param rect The rect to intersect with the current clip 2670910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project @param op The region op to apply to the current clip 2680910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project @return true if the canvas' clip is non-empty 2690910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project */ 2700910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project virtual bool clipRect(const SkRect& rect, 2710910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkRegion::Op op = SkRegion::kIntersect_Op); 2720910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 2730910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project /** Modify the current clip with the specified path. 2740910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project @param path The path to apply to the current clip 2750910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project @param op The region op to apply to the current clip 2760910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project @return true if the canvas' new clip is non-empty 2770910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project */ 2780910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project virtual bool clipPath(const SkPath& path, 2790910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkRegion::Op op = SkRegion::kIntersect_Op); 2800910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 2810910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project /** Modify the current clip with the specified region. Note that unlike 2820910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project clipRect() and clipPath() which transform their arguments by the current 2830910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project matrix, clipRegion() assumes its argument is already in device 2840910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project coordinates, and so no transformation is performed. 2850910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project @param deviceRgn The region to apply to the current clip 2860910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project @param op The region op to apply to the current clip 2870910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project @return true if the canvas' new clip is non-empty 2880910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project */ 2890910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project virtual bool clipRegion(const SkRegion& deviceRgn, 2900910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkRegion::Op op = SkRegion::kIntersect_Op); 2910910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 2920910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project /** Helper for clipRegion(rgn, kReplace_Op). Sets the current clip to the 2930910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project specified region. This does not intersect or in any other way account 2940910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project for the existing clip region. 2950910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project @param deviceRgn The region to copy into the current clip. 2960910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project @return true if the new clip region is non-empty 2970910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project */ 2980910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project bool setClipRegion(const SkRegion& deviceRgn) { 2990910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return this->clipRegion(deviceRgn, SkRegion::kReplace_Op); 3000910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 3010910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 3020910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project /** Enum describing how to treat edges when performing quick-reject tests 3030910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project of a geometry against the current clip. Treating them as antialiased 3040910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project (kAA_EdgeType) will take into account the extra pixels that may be drawn 3050910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project if the edge does not lie exactly on a device pixel boundary (after being 3060910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project transformed by the current matrix). 3070910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project */ 3080910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project enum EdgeType { 3090910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project /** Treat the edges as B&W (not antialiased) for the purposes of testing 3100910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project against the current clip 3110910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project */ 3120910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project kBW_EdgeType, 3130910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project /** Treat the edges as antialiased for the purposes of testing 3140910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project against the current clip 3150910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project */ 3160910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project kAA_EdgeType 3170910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project }; 3180910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 3190910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project /** Return true if the specified rectangle, after being transformed by the 3200910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project current matrix, would lie completely outside of the current clip. Call 3210910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project this to check if an area you intend to draw into is clipped out (and 3220910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project therefore you can skip making the draw calls). 3230910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project @param rect the rect to compare with the current clip 3240910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project @param et specifies how to treat the edges (see EdgeType) 3250910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project @return true if the rect (transformed by the canvas' matrix) does not 3260910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project intersect with the canvas' clip 3270910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project */ 3280910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project bool quickReject(const SkRect& rect, EdgeType et) const; 3290910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 3300910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project /** Return true if the specified path, after being transformed by the 3310910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project current matrix, would lie completely outside of the current clip. Call 3320910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project this to check if an area you intend to draw into is clipped out (and 3330910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project therefore you can skip making the draw calls). Note, for speed it may 3340910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return false even if the path itself might not intersect the clip 3350910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project (i.e. the bounds of the path intersects, but the path does not). 3360910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project @param path The path to compare with the current clip 3370910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project @param et specifies how to treat the edges (see EdgeType) 3380910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project @return true if the path (transformed by the canvas' matrix) does not 3390910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project intersect with the canvas' clip 3400910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project */ 3410910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project bool quickReject(const SkPath& path, EdgeType et) const; 3420910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 3430910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project /** Return true if the horizontal band specified by top and bottom is 3440910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project completely clipped out. This is a conservative calculation, meaning 3450910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project that it is possible that if the method returns false, the band may still 3460910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project in fact be clipped out, but the converse is not true. If this method 3470910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project returns true, then the band is guaranteed to be clipped out. 3480910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project @param top The top of the horizontal band to compare with the clip 3490910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project @param bottom The bottom of the horizontal and to compare with the clip 3500910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project @return true if the horizontal band is completely clipped out (i.e. does 3510910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project not intersect the current clip) 3520910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project */ 3530910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project bool quickRejectY(SkScalar top, SkScalar bottom, EdgeType et) const; 3540910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 3550910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project /** Return the bounds of the current clip (in local coordinates) in the 3560910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project bounds parameter, and return true if it is non-empty. This can be useful 3570910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project in a way similar to quickReject, in that it tells you that drawing 3580910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project outside of these bounds will be clipped out. 3590910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project */ 3600910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project bool getClipBounds(SkRect* bounds, EdgeType et = kAA_EdgeType) const; 3610910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 3620910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project /** Fill the entire canvas' bitmap (restricted to the current clip) with the 36359f59bde0b05a6ac5ff28fdebc1942dbf0d43aabMike Reed specified ARGB color, using the specified mode. 3640910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project @param a the alpha component (0..255) of the color to fill the canvas 3650910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project @param r the red component (0..255) of the color to fill the canvas 3660910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project @param g the green component (0..255) of the color to fill the canvas 3670910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project @param b the blue component (0..255) of the color to fill the canvas 3680910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project @param mode the mode to apply the color in (defaults to SrcOver) 3690910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project */ 3700910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project void drawARGB(U8CPU a, U8CPU r, U8CPU g, U8CPU b, 37159f59bde0b05a6ac5ff28fdebc1942dbf0d43aabMike Reed SkXfermode::Mode mode = SkXfermode::kSrcOver_Mode); 3720910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 3730910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project /** Fill the entire canvas' bitmap (restricted to the current clip) with the 37459f59bde0b05a6ac5ff28fdebc1942dbf0d43aabMike Reed specified color and mode. 3750910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project @param color the color to draw with 3760910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project @param mode the mode to apply the color in (defaults to SrcOver) 3770910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project */ 3780910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project void drawColor(SkColor color, 37959f59bde0b05a6ac5ff28fdebc1942dbf0d43aabMike Reed SkXfermode::Mode mode = SkXfermode::kSrcOver_Mode); 3800910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 3810910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project /** Fill the entire canvas' bitmap (restricted to the current clip) with the 3820910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project specified paint. 3830910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project @param paint The paint used to fill the canvas 3840910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project */ 3850910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project virtual void drawPaint(const SkPaint& paint); 3860910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 3870910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project enum PointMode { 3880910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project /** drawPoints draws each point separately */ 3890910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project kPoints_PointMode, 3900910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project /** drawPoints draws each pair of points as a line segment */ 3910910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project kLines_PointMode, 3920910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project /** drawPoints draws the array of points as a polygon */ 3930910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project kPolygon_PointMode 3940910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project }; 3950910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 3960910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project /** Draw a series of points, interpreted based on the PointMode mode. For 3970910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project all modes, the count parameter is interpreted as the total number of 3980910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project points. For kLine mode, count/2 line segments are drawn. 3990910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project For kPoint mode, each point is drawn centered at its coordinate, and its 4000910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project size is specified by the paint's stroke-width. It draws as a square, 4010910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project unless the paint's cap-type is round, in which the points are drawn as 4020910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project circles. 4030910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project For kLine mode, each pair of points is drawn as a line segment, 4040910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project respecting the paint's settings for cap/join/width. 4050910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project For kPolygon mode, the entire array is drawn as a series of connected 4060910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project line segments. 4070910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project Note that, while similar, kLine and kPolygon modes draw slightly 4080910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project differently than the equivalent path built with a series of moveto, 4090910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project lineto calls, in that the path will draw all of its contours at once, 4100910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project with no interactions if contours intersect each other (think XOR 4110910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project xfermode). drawPoints always draws each element one at a time. 4120910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project @param mode PointMode specifying how to draw the array of points. 4130910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project @param count The number of points in the array 4140910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project @param pts Array of points to draw 4150910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project @param paint The paint used to draw the points 4160910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project */ 4170910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project virtual void drawPoints(PointMode mode, size_t count, const SkPoint pts[], 4180910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project const SkPaint& paint); 4190910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 4200910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project /** Helper method for drawing a single point. See drawPoints() for a more 4210910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project details. 4220910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project */ 4230910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project void drawPoint(SkScalar x, SkScalar y, const SkPaint& paint); 42440528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger 4250910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project /** Draws a single pixel in the specified color. 4260910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project @param x The X coordinate of which pixel to draw 4270910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project @param y The Y coordiante of which pixel to draw 4280910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project @param color The color to draw 4290910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project */ 4300910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project void drawPoint(SkScalar x, SkScalar y, SkColor color); 4310910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 4320910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project /** Draw a line segment with the specified start and stop x,y coordinates, 4330910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project using the specified paint. NOTE: since a line is always "framed", the 4340910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project paint's Style is ignored. 4350910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project @param x0 The x-coordinate of the start point of the line 4360910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project @param y0 The y-coordinate of the start point of the line 4370910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project @param x1 The x-coordinate of the end point of the line 4380910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project @param y1 The y-coordinate of the end point of the line 4390910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project @param paint The paint used to draw the line 4400910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project */ 4410910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project void drawLine(SkScalar x0, SkScalar y0, SkScalar x1, SkScalar y1, 4420910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project const SkPaint& paint); 4430910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 4440910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project /** Draw the specified rectangle using the specified paint. The rectangle 4450910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project will be filled or stroked based on the Style in the paint. 4460910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project @param rect The rect to be drawn 4470910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project @param paint The paint used to draw the rect 4480910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project */ 4490910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project virtual void drawRect(const SkRect& rect, const SkPaint& paint); 4500910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 4510910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project /** Draw the specified rectangle using the specified paint. The rectangle 4520910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project will be filled or framed based on the Style in the paint. 4530910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project @param rect The rect to be drawn 4540910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project @param paint The paint used to draw the rect 4550910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project */ 4560910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project void drawIRect(const SkIRect& rect, const SkPaint& paint) 4570910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project { 4580910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkRect r; 4590910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project r.set(rect); // promotes the ints to scalars 4600910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project this->drawRect(r, paint); 4610910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 46240528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger 4630910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project /** Draw the specified rectangle using the specified paint. The rectangle 4640910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project will be filled or framed based on the Style in the paint. 4650910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project @param left The left side of the rectangle to be drawn 4660910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project @param top The top side of the rectangle to be drawn 4670910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project @param right The right side of the rectangle to be drawn 4680910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project @param bottom The bottom side of the rectangle to be drawn 4690910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project @param paint The paint used to draw the rect 4700910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project */ 4710910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project void drawRectCoords(SkScalar left, SkScalar top, SkScalar right, 4720910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkScalar bottom, const SkPaint& paint); 4730910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 4740910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project /** Draw the specified oval using the specified paint. The oval will be 4750910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project filled or framed based on the Style in the paint. 4760910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project @param oval The rectangle bounds of the oval to be drawn 4770910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project @param paint The paint used to draw the oval 4780910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project */ 4790910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project void drawOval(const SkRect& oval, const SkPaint&); 4800910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 4810910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project /** Draw the specified circle using the specified paint. If radius is <= 0, 4820910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project then nothing will be drawn. The circle will be filled 4830910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project or framed based on the Style in the paint. 4840910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project @param cx The x-coordinate of the center of the cirle to be drawn 4850910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project @param cy The y-coordinate of the center of the cirle to be drawn 4860910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project @param radius The radius of the cirle to be drawn 4870910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project @param paint The paint used to draw the circle 4880910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project */ 4890910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project void drawCircle(SkScalar cx, SkScalar cy, SkScalar radius, 4900910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project const SkPaint& paint); 4910910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 4920910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project /** Draw the specified arc, which will be scaled to fit inside the 4930910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project specified oval. If the sweep angle is >= 360, then the oval is drawn 4940910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project completely. Note that this differs slightly from SkPath::arcTo, which 4950910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project treats the sweep angle mod 360. 4960910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project @param oval The bounds of oval used to define the shape of the arc 4970910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project @param startAngle Starting angle (in degrees) where the arc begins 4980910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project @param sweepAngle Sweep angle (in degrees) measured clockwise 4990910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project @param useCenter true means include the center of the oval. For filling 5000910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project this will draw a wedge. False means just use the arc. 5010910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project @param paint The paint used to draw the arc 5020910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project */ 5030910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project void drawArc(const SkRect& oval, SkScalar startAngle, SkScalar sweepAngle, 5040910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project bool useCenter, const SkPaint& paint); 5050910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 5060910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project /** Draw the specified round-rect using the specified paint. The round-rect 5070910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project will be filled or framed based on the Style in the paint. 5080910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project @param rect The rectangular bounds of the roundRect to be drawn 5090910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project @param rx The x-radius of the oval used to round the corners 5100910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project @param ry The y-radius of the oval used to round the corners 5110910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project @param paint The paint used to draw the roundRect 5120910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project */ 5130910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project void drawRoundRect(const SkRect& rect, SkScalar rx, SkScalar ry, 5140910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project const SkPaint& paint); 5150910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 5160910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project /** Draw the specified path using the specified paint. The path will be 5170910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project filled or framed based on the Style in the paint. 5180910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project @param path The path to be drawn 5190910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project @param paint The paint used to draw the path 5200910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project */ 5210910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project virtual void drawPath(const SkPath& path, const SkPaint& paint); 5220910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 5230910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project /** Draw the specified bitmap, with its top/left corner at (x,y), using the 5240910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project specified paint, transformed by the current matrix. Note: if the paint 5250910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project contains a maskfilter that generates a mask which extends beyond the 5260910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project bitmap's original width/height, then the bitmap will be drawn as if it 5270910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project were in a Shader with CLAMP mode. Thus the color outside of the original 5280910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project width/height will be the edge color replicated. 5290910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project @param bitmap The bitmap to be drawn 5300910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project @param left The position of the left side of the bitmap being drawn 5310910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project @param top The position of the top side of the bitmap being drawn 5320910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project @param paint The paint used to draw the bitmap, or NULL 5330910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project */ 5340910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project virtual void drawBitmap(const SkBitmap& bitmap, SkScalar left, SkScalar top, 5350910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project const SkPaint* paint = NULL); 5360910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 5370910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project /** Draw the specified bitmap, with the specified matrix applied (before the 5380910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project canvas' matrix is applied). 5390910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project @param bitmap The bitmap to be drawn 5400910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project @param src Optional: specify the subset of the bitmap to be drawn 5410910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project @param dst The destination rectangle where the scaled/translated 5420910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project image will be drawn 5430910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project @param paint The paint used to draw the bitmap, or NULL 5440910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project */ 5450910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project virtual void drawBitmapRect(const SkBitmap& bitmap, const SkIRect* src, 5460910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project const SkRect& dst, const SkPaint* paint = NULL); 5470910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 5480910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project virtual void drawBitmapMatrix(const SkBitmap& bitmap, const SkMatrix& m, 5490910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project const SkPaint* paint = NULL); 55040528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger 5510910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project /** Draw the specified bitmap, with its top/left corner at (x,y), 5520910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project NOT transformed by the current matrix. Note: if the paint 5530910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project contains a maskfilter that generates a mask which extends beyond the 5540910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project bitmap's original width/height, then the bitmap will be drawn as if it 5550910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project were in a Shader with CLAMP mode. Thus the color outside of the original 5560910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project width/height will be the edge color replicated. 5570910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project @param bitmap The bitmap to be drawn 5580910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project @param left The position of the left side of the bitmap being drawn 5590910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project @param top The position of the top side of the bitmap being drawn 5600910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project @param paint The paint used to draw the bitmap, or NULL 5610910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project */ 5620910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project virtual void drawSprite(const SkBitmap& bitmap, int left, int top, 5630910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project const SkPaint* paint = NULL); 5640910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 5650910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project /** Draw the text, with origin at (x,y), using the specified paint. 5660910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project The origin is interpreted based on the Align setting in the paint. 5670910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project @param text The text to be drawn 5680910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project @param byteLength The number of bytes to read from the text parameter 5690910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project @param x The x-coordinate of the origin of the text being drawn 5700910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project @param y The y-coordinate of the origin of the text being drawn 5710910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project @param paint The paint used for the text (e.g. color, size, style) 5720910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project */ 5730910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project virtual void drawText(const void* text, size_t byteLength, SkScalar x, 5740910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkScalar y, const SkPaint& paint); 5750910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 5760910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project /** Draw the text, with each character/glyph origin specified by the pos[] 57740528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger array. The origin is interpreted by the Align setting in the paint. 5780910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project @param text The text to be drawn 5790910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project @param byteLength The number of bytes to read from the text parameter 5800910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project @param pos Array of positions, used to position each character 5810910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project @param paint The paint used for the text (e.g. color, size, style) 5820910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project */ 5830910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project virtual void drawPosText(const void* text, size_t byteLength, 5840910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project const SkPoint pos[], const SkPaint& paint); 58540528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger 5860910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project /** Draw the text, with each character/glyph origin specified by the x 5870910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project coordinate taken from the xpos[] array, and the y from the constY param. 58840528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger The origin is interpreted by the Align setting in the paint. 5890910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project @param text The text to be drawn 5900910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project @param byteLength The number of bytes to read from the text parameter 5910910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project @param xpos Array of x-positions, used to position each character 5920910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project @param constY The shared Y coordinate for all of the positions 5930910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project @param paint The paint used for the text (e.g. color, size, style) 5940910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project */ 5950910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project virtual void drawPosTextH(const void* text, size_t byteLength, 5960910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project const SkScalar xpos[], SkScalar constY, 5970910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project const SkPaint& paint); 59840528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger 5990910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project /** Draw the text, with origin at (x,y), using the specified paint, along 6000910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project the specified path. The paint's Align setting determins where along the 6010910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project path to start the text. 6020910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project @param text The text to be drawn 6030910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project @param byteLength The number of bytes to read from the text parameter 6040910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project @param path The path the text should follow for its baseline 6050910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project @param hOffset The distance along the path to add to the text's 6060910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project starting position 6070910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project @param vOffset The distance above(-) or below(+) the path to 6080910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project position the text 6090910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project @param paint The paint used for the text 6100910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project */ 6110910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project void drawTextOnPathHV(const void* text, size_t byteLength, 6120910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project const SkPath& path, SkScalar hOffset, 6130910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkScalar vOffset, const SkPaint& paint); 6140910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 6150910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project /** Draw the text, with origin at (x,y), using the specified paint, along 6160910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project the specified path. The paint's Align setting determins where along the 6170910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project path to start the text. 6180910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project @param text The text to be drawn 6190910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project @param byteLength The number of bytes to read from the text parameter 6200910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project @param path The path the text should follow for its baseline 6210910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project @param matrix (may be null) Applied to the text before it is 6220910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project mapped onto the path 6230910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project @param paint The paint used for the text 6240910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project */ 6250910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project virtual void drawTextOnPath(const void* text, size_t byteLength, 6260910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project const SkPath& path, const SkMatrix* matrix, 6270910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project const SkPaint& paint); 6280910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 62905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger#ifdef ANDROID 630a2dfb00239c367c3663e8487a8213d0edad238baAndreas Borglin /** Draw the text on path, with each character/glyph origin specified by the pos[] 631a2dfb00239c367c3663e8487a8213d0edad238baAndreas Borglin array. The origin is interpreted by the Align setting in the paint. 632a2dfb00239c367c3663e8487a8213d0edad238baAndreas Borglin @param text The text to be drawn 633a2dfb00239c367c3663e8487a8213d0edad238baAndreas Borglin @param byteLength The number of bytes to read from the text parameter 634a2dfb00239c367c3663e8487a8213d0edad238baAndreas Borglin @param pos Array of positions, used to position each character 635a2dfb00239c367c3663e8487a8213d0edad238baAndreas Borglin @param paint The paint used for the text (e.g. color, size, style) 636a2dfb00239c367c3663e8487a8213d0edad238baAndreas Borglin @param path The path to draw on 637a2dfb00239c367c3663e8487a8213d0edad238baAndreas Borglin @param matrix The canvas matrix 638a2dfb00239c367c3663e8487a8213d0edad238baAndreas Borglin */ 639a2dfb00239c367c3663e8487a8213d0edad238baAndreas Borglin void drawPosTextOnPath(const void* text, size_t byteLength, 640a2dfb00239c367c3663e8487a8213d0edad238baAndreas Borglin const SkPoint pos[], const SkPaint& paint, 641a2dfb00239c367c3663e8487a8213d0edad238baAndreas Borglin const SkPath& path, const SkMatrix* matrix); 64205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger#endif 643a2dfb00239c367c3663e8487a8213d0edad238baAndreas Borglin 6440910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project /** Draw the picture into this canvas. This method effective brackets the 6450910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project playback of the picture's draw calls with save/restore, so the state 6460910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project of this canvas will be unchanged after this call. This contrasts with 6470910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project the more immediate method SkPicture::draw(), which does not bracket 6480910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project the canvas with save/restore, thus the canvas may be left in a changed 6490910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project state after the call. 6500910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project @param picture The recorded drawing commands to playback into this 6510910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project canvas. 6520910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project */ 6530910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project virtual void drawPicture(SkPicture& picture); 65440528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger 655dab163f0b2658c2dba48839e72f81d3d8ee0ae8bMike Reed /** Draws the specified shape 656dab163f0b2658c2dba48839e72f81d3d8ee0ae8bMike Reed */ 657dab163f0b2658c2dba48839e72f81d3d8ee0ae8bMike Reed virtual void drawShape(SkShape*); 658dab163f0b2658c2dba48839e72f81d3d8ee0ae8bMike Reed 6590910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project enum VertexMode { 6600910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project kTriangles_VertexMode, 6610910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project kTriangleStrip_VertexMode, 6620910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project kTriangleFan_VertexMode 6630910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project }; 66440528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger 6650910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project /** Draw the array of vertices, interpreted as triangles (based on mode). 6660910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project @param vmode How to interpret the array of vertices 6670910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project @param vertexCount The number of points in the vertices array (and 6680910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project corresponding texs and colors arrays if non-null) 6690910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project @param vertices Array of vertices for the mesh 6700910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project @param texs May be null. If not null, specifies the coordinate 6710910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project in texture space for each vertex. 6720910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project @param colors May be null. If not null, specifies a color for each 6730910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project vertex, to be interpolated across the triangle. 6740910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project @param xmode Used if both texs and colors are present. In this 6750910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project case the colors are combined with the texture using mode, 6760910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project before being drawn using the paint. If mode is null, then 67759f59bde0b05a6ac5ff28fdebc1942dbf0d43aabMike Reed kMultiply_Mode is used. 6780910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project @param indices If not null, array of indices to reference into the 6790910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project vertex (texs, colors) array. 6800910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project @param indexCount number of entries in the indices array (if not null) 68140528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger @param paint Specifies the shader/texture if present. 6820910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project */ 6830910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project virtual void drawVertices(VertexMode vmode, int vertexCount, 6840910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project const SkPoint vertices[], const SkPoint texs[], 6850910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project const SkColor colors[], SkXfermode* xmode, 6860910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project const uint16_t indices[], int indexCount, 6870910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project const SkPaint& paint); 6880910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 68993d11b5b461a8677a8e3ffa94260f4f9897070acMike Reed /** Send a blob of data to the canvas. 69093d11b5b461a8677a8e3ffa94260f4f9897070acMike Reed For canvases that draw, this call is effectively a no-op, as the data 69193d11b5b461a8677a8e3ffa94260f4f9897070acMike Reed is not parsed, but just ignored. However, this call exists for 69293d11b5b461a8677a8e3ffa94260f4f9897070acMike Reed subclasses like SkPicture's recording canvas, that can store the data 69393d11b5b461a8677a8e3ffa94260f4f9897070acMike Reed and then play it back later (via another call to drawData). 69493d11b5b461a8677a8e3ffa94260f4f9897070acMike Reed */ 69593d11b5b461a8677a8e3ffa94260f4f9897070acMike Reed virtual void drawData(const void* data, size_t length); 69693d11b5b461a8677a8e3ffa94260f4f9897070acMike Reed 6970910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project ////////////////////////////////////////////////////////////////////////// 69840528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger 6990910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project /** Get the current bounder object. 7000910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project The bounder's reference count is unchaged. 7010910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project @return the canva's bounder (or NULL). 7020910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project */ 7030910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkBounder* getBounder() const { return fBounder; } 7040910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 7050910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project /** Set a new bounder (or NULL). 7060910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project Pass NULL to clear any previous bounder. 7070910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project As a convenience, the parameter passed is also returned. 7080910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project If a previous bounder exists, its reference count is decremented. 7090910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project If bounder is not NULL, its reference count is incremented. 7100910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project @param bounder the new bounder (or NULL) to be installed in the canvas 7110910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project @return the set bounder object 7120910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project */ 7130910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project virtual SkBounder* setBounder(SkBounder* bounder); 71440528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger 7150910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project /** Get the current filter object. The filter's reference count is not 7168f7d36c67f1bdde7ca1680857936f6af951e19e2Mike Reed affected. The filter is saved/restored, just like the matrix and clip. 7170910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project @return the canvas' filter (or NULL). 7180910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project */ 7190910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkDrawFilter* getDrawFilter() const; 72040528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger 7210910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project /** Set the new filter (or NULL). Pass NULL to clear any existing filter. 7220910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project As a convenience, the parameter is returned. If an existing filter 7230910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project exists, its refcnt is decrement. If the new filter is not null, its 7248f7d36c67f1bdde7ca1680857936f6af951e19e2Mike Reed refcnt is incremented. The filter is saved/restored, just like the 7258f7d36c67f1bdde7ca1680857936f6af951e19e2Mike Reed matrix and clip. 7260910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project @param filter the new filter (or NULL) 7270910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project @return the new filter 7280910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project */ 7290910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project virtual SkDrawFilter* setDrawFilter(SkDrawFilter* filter); 7300910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 7310910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project ////////////////////////////////////////////////////////////////////////// 7320910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 7330910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project /** Return the current matrix on the canvas. 7340910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project This does not account for the translate in any of the devices. 7350910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project @return The current matrix on the canvas. 7360910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project */ 7370910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project const SkMatrix& getTotalMatrix() const; 7380910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 7390910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project /** Return the current device clip (concatenation of all clip calls). 7400910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project This does not account for the translate in any of the devices. 7410910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project @return the current device clip (concatenation of all clip calls). 7420910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project */ 7430910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project const SkRegion& getTotalClip() const; 7440910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 74505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger /** 74605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger * Return the current clipstack. This mirrors the result in getTotalClip() 74705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger * but is represented as a stack of geometric clips + region-ops. 74805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger */ 74905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger const SkClipStack& getTotalClipStack() const; 75005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger 75140528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger void setExternalMatrix(const SkMatrix* = NULL); 7520910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 7530910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project /////////////////////////////////////////////////////////////////////////// 7540910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 7550910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project /** After calling saveLayer(), there can be any number of devices that make 7560910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project up the top-most drawing area. LayerIter can be used to iterate through 7570910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project those devices. Note that the iterator is only valid until the next API 7580910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project call made on the canvas. Ownership of all pointers in the iterator stays 7590910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project with the canvas, so none of them should be modified or deleted. 7600910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project */ 761137a4ca42423bbb6d683067ea544c9a48f18f06cDerek Sollenberger class SK_API LayerIter /*: SkNoncopyable*/ { 7620910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project public: 7630910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project /** Initialize iterator with canvas, and set values for 1st device */ 7640910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project LayerIter(SkCanvas*, bool skipEmptyClips); 7650910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project ~LayerIter(); 76640528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger 7670910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project /** Return true if the iterator is done */ 7680910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project bool done() const { return fDone; } 7690910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project /** Cycle to the next device */ 7700910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project void next(); 77140528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger 7720910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project // These reflect the current device in the iterator 7730910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 7740910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkDevice* device() const; 7750910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project const SkMatrix& matrix() const; 7760910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project const SkRegion& clip() const; 7770910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project const SkPaint& paint() const; 7780910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project int x() const; 7790910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project int y() const; 78040528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger 7810910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project private: 7820910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project // used to embed the SkDrawIter object directly in our instance, w/o 7830910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project // having to expose that class def to the public. There is an assert 7840910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project // in our constructor to ensure that fStorage is large enough 7850910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project // (though needs to be a compile-time-assert!). We use intptr_t to work 7860910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project // safely with 32 and 64 bit machines (to ensure the storage is enough) 78740528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger intptr_t fStorage[32]; 7880910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project class SkDrawIter* fImpl; // this points at fStorage 7890910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkPaint fDefaultPaint; 7900910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project bool fDone; 7910910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project }; 7920910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 7930910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectprotected: 7940910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project // all of the drawBitmap variants call this guy 79540528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger virtual void commonDrawBitmap(const SkBitmap&, const SkIRect*, 79640528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger const SkMatrix&, const SkPaint& paint); 79740528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger 7980910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectprivate: 7990910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project class MCRec; 8000910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 80171531ca1f484da5837be8017a0c83e5bff701587Derek Sollenberger SkClipStack fClipStack; 8020910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkDeque fMCStack; 8030910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project // points to top of stack 8040910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project MCRec* fMCRec; 8050910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project // the first N recs that can fit here mean we won't call malloc 8060910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project uint32_t fMCRecStorage[32]; 8070910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 8080910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkBounder* fBounder; 809f87ea139deed57504b433fc4e1bf98c85ef0da80Mike Reed SkDevice* fLastDeviceToGainFocus; 81020ab88413000fcc8668eeab25d9cb714097d0c45tedbo SkDeviceFactory* fDeviceFactory; 8110910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 81205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger void prepareForDeviceDraw(SkDevice*, const SkMatrix&, const SkRegion&, 81305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger const SkClipStack& clipStack); 81440528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger 8150910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project bool fDeviceCMDirty; // cleared by updateDeviceCMCache() 8160910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project void updateDeviceCMCache(); 8170910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 8180910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project friend class SkDrawIter; // needs setupDrawForLayerDevice() 8190910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 8200910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkDevice* init(SkDevice*); 82140528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger void internalDrawBitmap(const SkBitmap&, const SkIRect*, const SkMatrix& m, 8220910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project const SkPaint* paint); 8230910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project void drawDevice(SkDevice*, int x, int y, const SkPaint*); 8240910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project // shared by save() and saveLayer() 8250910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project int internalSave(SaveFlags flags); 8260910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project void internalRestore(); 82740528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger 8280910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project /* These maintain a cache of the clip bounds in local coordinates, 8290910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project (converted to 2s-compliment if floats are slow). 8300910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project */ 8310910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project mutable SkRectCompareType fLocalBoundsCompareType; 8320910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project mutable bool fLocalBoundsCompareTypeDirty; 8330910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 83443356962b0685a89e232a038b2b33162da04517dRomain Guy mutable SkRectCompareType fLocalBoundsCompareTypeBW; 83543356962b0685a89e232a038b2b33162da04517dRomain Guy mutable bool fLocalBoundsCompareTypeDirtyBW; 83643356962b0685a89e232a038b2b33162da04517dRomain Guy 83743356962b0685a89e232a038b2b33162da04517dRomain Guy /* Get the local clip bounds with an anti-aliased edge. 83843356962b0685a89e232a038b2b33162da04517dRomain Guy */ 8390910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project const SkRectCompareType& getLocalClipBoundsCompareType() const { 84043356962b0685a89e232a038b2b33162da04517dRomain Guy return getLocalClipBoundsCompareType(kAA_EdgeType); 84143356962b0685a89e232a038b2b33162da04517dRomain Guy } 84243356962b0685a89e232a038b2b33162da04517dRomain Guy 84343356962b0685a89e232a038b2b33162da04517dRomain Guy const SkRectCompareType& getLocalClipBoundsCompareType(EdgeType et) const { 84443356962b0685a89e232a038b2b33162da04517dRomain Guy if (et == kAA_EdgeType) { 84543356962b0685a89e232a038b2b33162da04517dRomain Guy if (fLocalBoundsCompareTypeDirty) { 84643356962b0685a89e232a038b2b33162da04517dRomain Guy this->computeLocalClipBoundsCompareType(et); 84743356962b0685a89e232a038b2b33162da04517dRomain Guy fLocalBoundsCompareTypeDirty = false; 84843356962b0685a89e232a038b2b33162da04517dRomain Guy } 84943356962b0685a89e232a038b2b33162da04517dRomain Guy return fLocalBoundsCompareType; 85043356962b0685a89e232a038b2b33162da04517dRomain Guy } else { 85143356962b0685a89e232a038b2b33162da04517dRomain Guy if (fLocalBoundsCompareTypeDirtyBW) { 85243356962b0685a89e232a038b2b33162da04517dRomain Guy this->computeLocalClipBoundsCompareType(et); 85343356962b0685a89e232a038b2b33162da04517dRomain Guy fLocalBoundsCompareTypeDirtyBW = false; 85443356962b0685a89e232a038b2b33162da04517dRomain Guy } 85543356962b0685a89e232a038b2b33162da04517dRomain Guy return fLocalBoundsCompareTypeBW; 8560910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 8570910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 85843356962b0685a89e232a038b2b33162da04517dRomain Guy void computeLocalClipBoundsCompareType(EdgeType et) const; 85940528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger 86040528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger SkMatrix fExternalMatrix, fExternalInverse; 86140528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger bool fUseExternalMatrix; 86271531ca1f484da5837be8017a0c83e5bff701587Derek Sollenberger 86371531ca1f484da5837be8017a0c83e5bff701587Derek Sollenberger class AutoValidateClip : ::SkNoncopyable { 86471531ca1f484da5837be8017a0c83e5bff701587Derek Sollenberger public: 86571531ca1f484da5837be8017a0c83e5bff701587Derek Sollenberger explicit AutoValidateClip(SkCanvas* canvas) : fCanvas(canvas) { 86671531ca1f484da5837be8017a0c83e5bff701587Derek Sollenberger fCanvas->validateClip(); 86771531ca1f484da5837be8017a0c83e5bff701587Derek Sollenberger } 86871531ca1f484da5837be8017a0c83e5bff701587Derek Sollenberger ~AutoValidateClip() { fCanvas->validateClip(); } 86971531ca1f484da5837be8017a0c83e5bff701587Derek Sollenberger 87071531ca1f484da5837be8017a0c83e5bff701587Derek Sollenberger private: 87171531ca1f484da5837be8017a0c83e5bff701587Derek Sollenberger const SkCanvas* fCanvas; 87271531ca1f484da5837be8017a0c83e5bff701587Derek Sollenberger }; 87371531ca1f484da5837be8017a0c83e5bff701587Derek Sollenberger 87471531ca1f484da5837be8017a0c83e5bff701587Derek Sollenberger#ifdef SK_DEBUG 87571531ca1f484da5837be8017a0c83e5bff701587Derek Sollenberger void validateClip() const; 87671531ca1f484da5837be8017a0c83e5bff701587Derek Sollenberger#else 87771531ca1f484da5837be8017a0c83e5bff701587Derek Sollenberger void validateClip() const {} 87871531ca1f484da5837be8017a0c83e5bff701587Derek Sollenberger#endif 8790910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}; 8800910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 8810910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project/** Stack helper class to automatically call restoreToCount() on the canvas 8820910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project when this object goes out of scope. Use this to guarantee that the canvas 8830910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project is restored to a known state. 8840910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project*/ 8850910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectclass SkAutoCanvasRestore : SkNoncopyable { 8860910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectpublic: 8870910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkAutoCanvasRestore(SkCanvas* canvas, bool doSave) : fCanvas(canvas) { 8880910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkASSERT(canvas); 8890910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project fSaveCount = canvas->getSaveCount(); 8900910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project if (doSave) { 8910910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project canvas->save(); 8920910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 8930910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 8940910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project ~SkAutoCanvasRestore() { 8950910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project fCanvas->restoreToCount(fSaveCount); 8960910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 8970910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 8980910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectprivate: 8990910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkCanvas* fCanvas; 9000910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project int fSaveCount; 9010910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}; 9020910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 9030910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#endif 9040910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 905