11cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 20910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project/* 31cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * Copyright 2006 The Android Open Source Project 40910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project * 51cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * Use of this source code is governed by a BSD-style license that can be 61cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * found in the LICENSE file. 70910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project */ 80910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 91cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 100910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#ifndef SkDraw_DEFINED 110910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define SkDraw_DEFINED 120910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 130910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkBitmap.h" 140910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkCanvas.h" 150910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkMask.h" 160910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkMatrix.h" 170910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkPaint.h" 180910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkRect.h" 190910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkAutoKern.h" 200910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 210910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectclass SkBounder; 2205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenbergerclass SkClipStack; 230910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectclass SkDevice; 240910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectclass SkPath; 250910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectclass SkRegion; 261cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerclass SkRasterClip; 270910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectstruct SkDrawProcs; 280910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 290910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectclass SkDraw { 300910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectpublic: 3140528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger SkDraw(); 320910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkDraw(const SkDraw& src); 330910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 340910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project void drawPaint(const SkPaint&) const; 350910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project void drawPoints(SkCanvas::PointMode, size_t count, const SkPoint[], 3640528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger const SkPaint&, bool forceUseDevice = false) const; 370910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project void drawRect(const SkRect&, const SkPaint&) const; 3887b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger /** 3987b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger * To save on mallocs, we allow a flag that tells us that srcPath is 4087b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger * mutable, so that we don't have to make copies of it as we transform it. 4187b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger * 4287b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger * If prePathMatrix is not null, it should logically be applied before any 4387b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger * stroking or other effects. If there are no effects on the paint that 4487b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger * affect the geometry/rasterization, then the pre matrix can just be 4587b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger * pre-concated with the current matrix. 4687b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger */ 470910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project void drawPath(const SkPath& srcPath, const SkPaint&, 480910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project const SkMatrix* prePathMatrix, bool pathIsMutable) const; 490910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project void drawBitmap(const SkBitmap&, const SkMatrix&, const SkPaint&) const; 500910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project void drawSprite(const SkBitmap&, int x, int y, const SkPaint&) const; 510910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project void drawText(const char text[], size_t byteLength, SkScalar x, 520910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkScalar y, const SkPaint& paint) const; 530910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project void drawPosText(const char text[], size_t byteLength, 540910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project const SkScalar pos[], SkScalar constY, 550910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project int scalarsPerPosition, const SkPaint& paint) const; 560910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project void drawTextOnPath(const char text[], size_t byteLength, 570910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project const SkPath&, const SkMatrix*, const SkPaint&) const; 581cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#ifdef SK_BUILD_FOR_ANDROID 59a2dfb00239c367c3663e8487a8213d0edad238baAndreas Borglin void drawPosTextOnPath(const char text[], size_t byteLength, 60a2dfb00239c367c3663e8487a8213d0edad238baAndreas Borglin const SkPoint pos[], const SkPaint& paint, 61a2dfb00239c367c3663e8487a8213d0edad238baAndreas Borglin const SkPath& path, const SkMatrix* matrix) const; 6205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger#endif 630910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project void drawVertices(SkCanvas::VertexMode mode, int count, 640910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project const SkPoint vertices[], const SkPoint textures[], 650910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project const SkColor colors[], SkXfermode* xmode, 660910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project const uint16_t indices[], int ptCount, 670910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project const SkPaint& paint) const; 6805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger 690910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project void drawPath(const SkPath& src, const SkPaint& paint) const { 700910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project this->drawPath(src, paint, NULL, false); 710910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 720910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 730910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project /** Helper function that creates a mask from a path and an optional maskfilter. 740910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project Note however, that the resulting mask will not have been actually filtered, 750910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project that must be done afterwards (by calling filterMask). The maskfilter is provided 760910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project solely to assist in computing the mask's bounds (if the mode requests that). 770910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project */ 780910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project static bool DrawToMask(const SkPath& devPath, const SkIRect* clipBounds, 790910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkMaskFilter* filter, const SkMatrix* filterMatrix, 800910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkMask* mask, SkMask::CreateMode mode); 810910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 8287b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger enum RectType { 8387b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger kHair_RectType, 8487b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger kFill_RectType, 8587b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger kStroke_RectType, 8687b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger kPath_RectType 8787b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger }; 8887b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger 8987b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger /** 9087b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger * Based on the paint's style, strokeWidth, and the matrix, classify how 9187b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger * to draw the rect. If no special-case is available, returns 9287b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger * kPath_RectType. 9387b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger * 9487b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger * Iff RectType == kStroke_RectType, then strokeSize is set to the device 9587b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger * width and height of the stroke. 9687b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger */ 9787b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger static RectType ComputeRectType(const SkPaint&, const SkMatrix&, 9887b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger SkPoint* strokeSize); 9987b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger 1000910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectprivate: 1010910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project void drawText_asPaths(const char text[], size_t byteLength, 1020910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkScalar x, SkScalar y, const SkPaint&) const; 1030910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project void drawDevMask(const SkMask& mask, const SkPaint&) const; 1040910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project void drawBitmapAsMask(const SkBitmap&, const SkPaint&) const; 1050910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 1060910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectpublic: 1070910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project const SkBitmap* fBitmap; // required 1080910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project const SkMatrix* fMatrix; // required 1091cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger const SkRegion* fClip; // DEPRECATED 1101cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger const SkRasterClip* fRC; // required 11140528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger 11205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger const SkClipStack* fClipStack; // optional 1130910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkDevice* fDevice; // optional 1140910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkBounder* fBounder; // optional 1150910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkDrawProcs* fProcs; // optional 1160910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 11740528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger const SkMatrix* fMVMatrix; // optional 11840528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger const SkMatrix* fExtMatrix; // optional 11940528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger 1200910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#ifdef SK_DEBUG 12140528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger void validate() const; 12240528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger#else 12340528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger void validate() const {} 1240910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#endif 1250910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}; 1260910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 1270910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectclass SkGlyphCache; 1280910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 1290910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectclass SkTextToPathIter { 1300910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectpublic: 1310910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkTextToPathIter(const char text[], size_t length, const SkPaint&, 1320910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project bool applyStrokeAndPathEffects, bool forceLinearTextOn); 1330910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project ~SkTextToPathIter(); 1340910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 1350910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project const SkPaint& getPaint() const { return fPaint; } 1360910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkScalar getPathScale() const { return fScale; } 1370910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 1380910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project const SkPath* next(SkScalar* xpos); //!< returns nil when there are no more paths 1390910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 1400910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectprivate: 1410910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkGlyphCache* fCache; 1420910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkPaint fPaint; 1430910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkScalar fScale; 1440910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkFixed fPrevAdvance; 1450910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project const char* fText; 1460910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project const char* fStop; 1470910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkMeasureCacheProc fGlyphCacheProc; 1480910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 1490910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project const SkPath* fPath; // returned in next 1500910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkScalar fXPos; // accumulated xpos, returned in next 1510910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkAutoKern fAutoKern; 1521cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger int fXYIndex; // cache for horizontal -vs- vertical text 1530910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}; 1540910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 1550910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#endif 1560910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 1570910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 158