1ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com
28a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com/*
3ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Copyright 2006 The Android Open Source Project
48a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com *
5ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Use of this source code is governed by a BSD-style license that can be
6ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * found in the LICENSE file.
78a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com */
88a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
9ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com
108a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#ifndef SkDraw_DEFINED
118a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#define SkDraw_DEFINED
128a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
138a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkCanvas.h"
148a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkMask.h"
158a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkPaint.h"
168a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
17a9e1824e009015ef2a60491916780e96c220afb8tomhudson@google.comclass SkBitmap;
187d7ca79c3e6e6be7b7849b0d9a7fe26effb89c38reed@google.comclass SkClipStack;
191f2f338e23789f3eef168dcbd8171a28820ba6c1robertphillips@google.comclass SkBaseDevice;
2053f0959fc024c56dc55fe6bf86380127b59abec9krajcevskiclass SkBlitter;
21a9e1824e009015ef2a60491916780e96c220afb8tomhudson@google.comclass SkMatrix;
228a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comclass SkPath;
238a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comclass SkRegion;
24045e62d715f5ee9b03deb5af3c750f8318096179reed@google.comclass SkRasterClip;
258a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comstruct SkDrawProcs;
26a9e1824e009015ef2a60491916780e96c220afb8tomhudson@google.comstruct SkRect;
27a8e33a92e27ca1523601226cad83c79a7e00c93bscroggo@google.comclass SkRRect;
288a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
298a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comclass SkDraw {
308a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.compublic:
31f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com    SkDraw();
328a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkDraw(const SkDraw& src);
338a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
348a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    void    drawPaint(const SkPaint&) const;
358a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    void    drawPoints(SkCanvas::PointMode, size_t count, const SkPoint[],
36f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com                       const SkPaint&, bool forceUseDevice = false) const;
378a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    void    drawRect(const SkRect&, const SkPaint&) const;
38a8e33a92e27ca1523601226cad83c79a7e00c93bscroggo@google.com    void    drawRRect(const SkRRect&, const SkPaint&) const;
397ff8d81290c3d9d461f2e304f4fd7846275f956dreed@google.com    /**
407ff8d81290c3d9d461f2e304f4fd7846275f956dreed@google.com     *  To save on mallocs, we allow a flag that tells us that srcPath is
417ff8d81290c3d9d461f2e304f4fd7846275f956dreed@google.com     *  mutable, so that we don't have to make copies of it as we transform it.
427ff8d81290c3d9d461f2e304f4fd7846275f956dreed@google.com     *
437ff8d81290c3d9d461f2e304f4fd7846275f956dreed@google.com     *  If prePathMatrix is not null, it should logically be applied before any
447ff8d81290c3d9d461f2e304f4fd7846275f956dreed@google.com     *  stroking or other effects. If there are no effects on the paint that
457ff8d81290c3d9d461f2e304f4fd7846275f956dreed@google.com     *  affect the geometry/rasterization, then the pre matrix can just be
467ff8d81290c3d9d461f2e304f4fd7846275f956dreed@google.com     *  pre-concated with the current matrix.
477ff8d81290c3d9d461f2e304f4fd7846275f956dreed@google.com     */
48126f7f5244502c0cbf1e5fec1d2ad7a0f2eb6c34reed@google.com    void    drawPath(const SkPath& path, const SkPaint& paint,
49126f7f5244502c0cbf1e5fec1d2ad7a0f2eb6c34reed@google.com                     const SkMatrix* prePathMatrix, bool pathIsMutable) const {
50126f7f5244502c0cbf1e5fec1d2ad7a0f2eb6c34reed@google.com        this->drawPath(path, paint, prePathMatrix, pathIsMutable, false);
51126f7f5244502c0cbf1e5fec1d2ad7a0f2eb6c34reed@google.com    }
52126f7f5244502c0cbf1e5fec1d2ad7a0f2eb6c34reed@google.com
5353f0959fc024c56dc55fe6bf86380127b59abec9krajcevski    void drawPath(const SkPath& path, const SkPaint& paint,
5453f0959fc024c56dc55fe6bf86380127b59abec9krajcevski                  SkBlitter* customBlitter = NULL) const {
5553f0959fc024c56dc55fe6bf86380127b59abec9krajcevski        this->drawPath(path, paint, NULL, false, false, customBlitter);
56126f7f5244502c0cbf1e5fec1d2ad7a0f2eb6c34reed@google.com    }
57126f7f5244502c0cbf1e5fec1d2ad7a0f2eb6c34reed@google.com
588a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    void    drawBitmap(const SkBitmap&, const SkMatrix&, const SkPaint&) const;
598a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    void    drawSprite(const SkBitmap&, int x, int y, const SkPaint&) const;
608a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    void    drawText(const char text[], size_t byteLength, SkScalar x,
618a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                     SkScalar y, const SkPaint& paint) const;
628a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    void    drawPosText(const char text[], size_t byteLength,
638a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                        const SkScalar pos[], SkScalar constY,
648a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                        int scalarsPerPosition, const SkPaint& paint) const;
658a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    void    drawTextOnPath(const char text[], size_t byteLength,
668a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                        const SkPath&, const SkMatrix*, const SkPaint&) const;
678a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    void    drawVertices(SkCanvas::VertexMode mode, int count,
688a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                         const SkPoint vertices[], const SkPoint textures[],
698a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                         const SkColor colors[], SkXfermode* xmode,
708a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                         const uint16_t indices[], int ptCount,
718a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                         const SkPaint& paint) const;
727d7ca79c3e6e6be7b7849b0d9a7fe26effb89c38reed@google.com
73126f7f5244502c0cbf1e5fec1d2ad7a0f2eb6c34reed@google.com    /**
74126f7f5244502c0cbf1e5fec1d2ad7a0f2eb6c34reed@google.com     *  Overwrite the target with the path's coverage (i.e. its mask).
75126f7f5244502c0cbf1e5fec1d2ad7a0f2eb6c34reed@google.com     *  Will overwrite the entire device, so it need not be zero'd first.
76126f7f5244502c0cbf1e5fec1d2ad7a0f2eb6c34reed@google.com     *
77126f7f5244502c0cbf1e5fec1d2ad7a0f2eb6c34reed@google.com     *  Only device A8 is supported right now.
78126f7f5244502c0cbf1e5fec1d2ad7a0f2eb6c34reed@google.com     */
7953f0959fc024c56dc55fe6bf86380127b59abec9krajcevski    void drawPathCoverage(const SkPath& src, const SkPaint& paint,
8053f0959fc024c56dc55fe6bf86380127b59abec9krajcevski                          SkBlitter* customBlitter = NULL) const {
8153f0959fc024c56dc55fe6bf86380127b59abec9krajcevski        this->drawPath(src, paint, NULL, false, true, customBlitter);
828a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    }
838a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
848a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    /** Helper function that creates a mask from a path and an optional maskfilter.
858a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        Note however, that the resulting mask will not have been actually filtered,
868a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        that must be done afterwards (by calling filterMask). The maskfilter is provided
878a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        solely to assist in computing the mask's bounds (if the mode requests that).
888a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    */
898a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    static bool DrawToMask(const SkPath& devPath, const SkIRect* clipBounds,
9030711b764be6bbb58caa30a0ac5d1474c894efe7reed@google.com                           const SkMaskFilter*, const SkMatrix* filterMatrix,
912ac4ef5e6e0c9c95c9200408ba25a95ca758eac2junov@chromium.org                           SkMask* mask, SkMask::CreateMode mode,
922ac4ef5e6e0c9c95c9200408ba25a95ca758eac2junov@chromium.org                           SkPaint::Style style);
938a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
9462ab7addb06bbc5b93460eaf2f70a9f8399308d3reed@google.com    enum RectType {
9562ab7addb06bbc5b93460eaf2f70a9f8399308d3reed@google.com        kHair_RectType,
9662ab7addb06bbc5b93460eaf2f70a9f8399308d3reed@google.com        kFill_RectType,
9762ab7addb06bbc5b93460eaf2f70a9f8399308d3reed@google.com        kStroke_RectType,
9862ab7addb06bbc5b93460eaf2f70a9f8399308d3reed@google.com        kPath_RectType
9962ab7addb06bbc5b93460eaf2f70a9f8399308d3reed@google.com    };
10062ab7addb06bbc5b93460eaf2f70a9f8399308d3reed@google.com
10162ab7addb06bbc5b93460eaf2f70a9f8399308d3reed@google.com    /**
10262ab7addb06bbc5b93460eaf2f70a9f8399308d3reed@google.com     *  Based on the paint's style, strokeWidth, and the matrix, classify how
10362ab7addb06bbc5b93460eaf2f70a9f8399308d3reed@google.com     *  to draw the rect. If no special-case is available, returns
10462ab7addb06bbc5b93460eaf2f70a9f8399308d3reed@google.com     *  kPath_RectType.
10562ab7addb06bbc5b93460eaf2f70a9f8399308d3reed@google.com     *
10662ab7addb06bbc5b93460eaf2f70a9f8399308d3reed@google.com     *  Iff RectType == kStroke_RectType, then strokeSize is set to the device
10762ab7addb06bbc5b93460eaf2f70a9f8399308d3reed@google.com     *  width and height of the stroke.
10862ab7addb06bbc5b93460eaf2f70a9f8399308d3reed@google.com     */
10962ab7addb06bbc5b93460eaf2f70a9f8399308d3reed@google.com    static RectType ComputeRectType(const SkPaint&, const SkMatrix&,
11062ab7addb06bbc5b93460eaf2f70a9f8399308d3reed@google.com                                    SkPoint* strokeSize);
11162ab7addb06bbc5b93460eaf2f70a9f8399308d3reed@google.com
1128128d8c119382279918b90ad8d80ccb3aaebb8a0commit-bot@chromium.org    static bool ShouldDrawTextAsPaths(const SkPaint&, const SkMatrix&);
1138128d8c119382279918b90ad8d80ccb3aaebb8a0commit-bot@chromium.org    void        drawText_asPaths(const char text[], size_t byteLength,
1148128d8c119382279918b90ad8d80ccb3aaebb8a0commit-bot@chromium.org                                 SkScalar x, SkScalar y, const SkPaint&) const;
1158128d8c119382279918b90ad8d80ccb3aaebb8a0commit-bot@chromium.org    void        drawPosText_asPaths(const char text[], size_t byteLength,
1168128d8c119382279918b90ad8d80ccb3aaebb8a0commit-bot@chromium.org                                    const SkScalar pos[], SkScalar constY,
1178128d8c119382279918b90ad8d80ccb3aaebb8a0commit-bot@chromium.org                                    int scalarsPerPosition, const SkPaint&) const;
1185e00989a283111cef05bed8102e45c16651e43e4commit-bot@chromium.org
1195e00989a283111cef05bed8102e45c16651e43e4commit-bot@chromium.orgprivate:
1205e00989a283111cef05bed8102e45c16651e43e4commit-bot@chromium.org    void    drawDevMask(const SkMask& mask, const SkPaint&) const;
1215e00989a283111cef05bed8102e45c16651e43e4commit-bot@chromium.org    void    drawBitmapAsMask(const SkBitmap&, const SkPaint&) const;
122126f7f5244502c0cbf1e5fec1d2ad7a0f2eb6c34reed@google.com
123126f7f5244502c0cbf1e5fec1d2ad7a0f2eb6c34reed@google.com    void    drawPath(const SkPath&, const SkPaint&, const SkMatrix* preMatrix,
12453f0959fc024c56dc55fe6bf86380127b59abec9krajcevski                     bool pathIsMutable, bool drawCoverage,
12553f0959fc024c56dc55fe6bf86380127b59abec9krajcevski                     SkBlitter* customBlitter = NULL) const;
1268f6ef4010f6835c5ce9ede180e50a6a58512a81eskia.committer@gmail.com
1274bbdeac58cc928dc66296bde3bd06e78070d96b7reed@google.com    /**
1284bbdeac58cc928dc66296bde3bd06e78070d96b7reed@google.com     *  Return the current clip bounds, in local coordinates, with slop to account
1294bbdeac58cc928dc66296bde3bd06e78070d96b7reed@google.com     *  for antialiasing or hairlines (i.e. device-bounds outset by 1, and then
1304bbdeac58cc928dc66296bde3bd06e78070d96b7reed@google.com     *  run through the inverse of the matrix).
1314bbdeac58cc928dc66296bde3bd06e78070d96b7reed@google.com     *
1324bbdeac58cc928dc66296bde3bd06e78070d96b7reed@google.com     *  If the matrix cannot be inverted, or the current clip is empty, return
1334bbdeac58cc928dc66296bde3bd06e78070d96b7reed@google.com     *  false and ignore bounds parameter.
1344bbdeac58cc928dc66296bde3bd06e78070d96b7reed@google.com     */
1354bbdeac58cc928dc66296bde3bd06e78070d96b7reed@google.com    bool SK_WARN_UNUSED_RESULT
1364bbdeac58cc928dc66296bde3bd06e78070d96b7reed@google.com    computeConservativeLocalClipBounds(SkRect* bounds) const;
1374024f32d99b63a599c544a49f526e53c25135159skia.committer@gmail.com
1388a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.compublic:
1398a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    const SkBitmap* fBitmap;        // required
1408a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    const SkMatrix* fMatrix;        // required
141045e62d715f5ee9b03deb5af3c750f8318096179reed@google.com    const SkRegion* fClip;          // DEPRECATED
142045e62d715f5ee9b03deb5af3c750f8318096179reed@google.com    const SkRasterClip* fRC;        // required
143f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com
1447d7ca79c3e6e6be7b7849b0d9a7fe26effb89c38reed@google.com    const SkClipStack* fClipStack;  // optional
1451f2f338e23789f3eef168dcbd8171a28820ba6c1robertphillips@google.com    SkBaseDevice*   fDevice;        // optional
1468a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkDrawProcs*    fProcs;         // optional
1478a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1488a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#ifdef SK_DEBUG
149f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com    void validate() const;
150f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com#else
151f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com    void validate() const {}
1528a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#endif
1538a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com};
1548a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1558a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#endif
156