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