19241e33ca900c5fd8f902829255f381f8e6e17c8robertphillips@google.com/*
29241e33ca900c5fd8f902829255f381f8e6e17c8robertphillips@google.com * Copyright 2013 Google Inc.
39241e33ca900c5fd8f902829255f381f8e6e17c8robertphillips@google.com *
49241e33ca900c5fd8f902829255f381f8e6e17c8robertphillips@google.com * Use of this source code is governed by a BSD-style license that can be
59241e33ca900c5fd8f902829255f381f8e6e17c8robertphillips@google.com * found in the LICENSE file.
69241e33ca900c5fd8f902829255f381f8e6e17c8robertphillips@google.com */
79241e33ca900c5fd8f902829255f381f8e6e17c8robertphillips@google.com
89241e33ca900c5fd8f902829255f381f8e6e17c8robertphillips@google.com#ifndef SkBitmapDevice_DEFINED
99241e33ca900c5fd8f902829255f381f8e6e17c8robertphillips@google.com#define SkBitmapDevice_DEFINED
109241e33ca900c5fd8f902829255f381f8e6e17c8robertphillips@google.com
11986480a71f4e860663ced7ad90a1fe346a164afbMike Reed#include "SkBitmap.h"
12986480a71f4e860663ced7ad90a1fe346a164afbMike Reed#include "SkCanvas.h"
13986480a71f4e860663ced7ad90a1fe346a164afbMike Reed#include "SkColor.h"
14986480a71f4e860663ced7ad90a1fe346a164afbMike Reed#include "SkDevice.h"
15986480a71f4e860663ced7ad90a1fe346a164afbMike Reed#include "SkImageInfo.h"
16986480a71f4e860663ced7ad90a1fe346a164afbMike Reed#include "SkPixelRef.h"
177627fa51044e35dc21251f925b56f6dd6887df97Mike Reed#include "SkRasterClip.h"
18c42a1cdd1de7a3cf57a9a5fd7363f5fb660e97d0Mike Reed#include "SkRasterClipStack.h"
19986480a71f4e860663ced7ad90a1fe346a164afbMike Reed#include "SkRect.h"
20986480a71f4e860663ced7ad90a1fe346a164afbMike Reed#include "SkScalar.h"
21986480a71f4e860663ced7ad90a1fe346a164afbMike Reed#include "SkSize.h"
22986480a71f4e860663ced7ad90a1fe346a164afbMike Reed#include "SkSurfaceProps.h"
23986480a71f4e860663ced7ad90a1fe346a164afbMike Reed
24986480a71f4e860663ced7ad90a1fe346a164afbMike Reedclass SkImageFilterCache;
25986480a71f4e860663ced7ad90a1fe346a164afbMike Reedclass SkMatrix;
26986480a71f4e860663ced7ad90a1fe346a164afbMike Reedclass SkPaint;
27986480a71f4e860663ced7ad90a1fe346a164afbMike Reedclass SkPath;
28986480a71f4e860663ced7ad90a1fe346a164afbMike Reedclass SkPixelRef;
29986480a71f4e860663ced7ad90a1fe346a164afbMike Reedclass SkPixmap;
30986480a71f4e860663ced7ad90a1fe346a164afbMike Reedclass SkRasterHandleAllocator;
31986480a71f4e860663ced7ad90a1fe346a164afbMike Reedclass SkRRect;
32986480a71f4e860663ced7ad90a1fe346a164afbMike Reedclass SkSurface;
33986480a71f4e860663ced7ad90a1fe346a164afbMike Reedstruct SkPoint;
34986480a71f4e860663ced7ad90a1fe346a164afbMike Reed
35986480a71f4e860663ced7ad90a1fe346a164afbMike Reed///////////////////////////////////////////////////////////////////////////////
36986480a71f4e860663ced7ad90a1fe346a164afbMike Reedclass SK_API SkBitmapDevice : public SkBaseDevice {
37986480a71f4e860663ced7ad90a1fe346a164afbMike Reedpublic:
38986480a71f4e860663ced7ad90a1fe346a164afbMike Reed    /**
39986480a71f4e860663ced7ad90a1fe346a164afbMike Reed     *  Construct a new device with the specified bitmap as its backend. It is
40986480a71f4e860663ced7ad90a1fe346a164afbMike Reed     *  valid for the bitmap to have no pixels associated with it. In that case,
41986480a71f4e860663ced7ad90a1fe346a164afbMike Reed     *  any drawing to this device will have no effect.
42986480a71f4e860663ced7ad90a1fe346a164afbMike Reed     */
43986480a71f4e860663ced7ad90a1fe346a164afbMike Reed    SkBitmapDevice(const SkBitmap& bitmap);
44986480a71f4e860663ced7ad90a1fe346a164afbMike Reed
45986480a71f4e860663ced7ad90a1fe346a164afbMike Reed    /**
46986480a71f4e860663ced7ad90a1fe346a164afbMike Reed     * Create a new device along with its requisite pixel memory using
47986480a71f4e860663ced7ad90a1fe346a164afbMike Reed     * default SkSurfaceProps (i.e., kLegacyFontHost_InitType-style).
48986480a71f4e860663ced7ad90a1fe346a164afbMike Reed     * Note: this entry point is slated for removal - no one should call it.
49986480a71f4e860663ced7ad90a1fe346a164afbMike Reed     */
50986480a71f4e860663ced7ad90a1fe346a164afbMike Reed    static SkBitmapDevice* Create(const SkImageInfo& info);
51986480a71f4e860663ced7ad90a1fe346a164afbMike Reed
52986480a71f4e860663ced7ad90a1fe346a164afbMike Reed    /**
53986480a71f4e860663ced7ad90a1fe346a164afbMike Reed     *  Construct a new device with the specified bitmap as its backend. It is
54986480a71f4e860663ced7ad90a1fe346a164afbMike Reed     *  valid for the bitmap to have no pixels associated with it. In that case,
55986480a71f4e860663ced7ad90a1fe346a164afbMike Reed     *  any drawing to this device will have no effect.
56986480a71f4e860663ced7ad90a1fe346a164afbMike Reed     */
57986480a71f4e860663ced7ad90a1fe346a164afbMike Reed    SkBitmapDevice(const SkBitmap& bitmap, const SkSurfaceProps& surfaceProps,
58986480a71f4e860663ced7ad90a1fe346a164afbMike Reed                   void* externalHandle = nullptr);
59986480a71f4e860663ced7ad90a1fe346a164afbMike Reed
60986480a71f4e860663ced7ad90a1fe346a164afbMike Reed    static SkBitmapDevice* Create(const SkImageInfo&, const SkSurfaceProps&,
61986480a71f4e860663ced7ad90a1fe346a164afbMike Reed                                  SkRasterHandleAllocator* = nullptr);
62986480a71f4e860663ced7ad90a1fe346a164afbMike Reed
63986480a71f4e860663ced7ad90a1fe346a164afbMike Reedprotected:
64986480a71f4e860663ced7ad90a1fe346a164afbMike Reed    bool onShouldDisableLCD(const SkPaint&) const override;
65986480a71f4e860663ced7ad90a1fe346a164afbMike Reed    void* getRasterHandle() const override { return fRasterHandle; }
66986480a71f4e860663ced7ad90a1fe346a164afbMike Reed
67986480a71f4e860663ced7ad90a1fe346a164afbMike Reed    /** These are called inside the per-device-layer loop for each draw call.
68986480a71f4e860663ced7ad90a1fe346a164afbMike Reed     When these are called, we have already applied any saveLayer operations,
69986480a71f4e860663ced7ad90a1fe346a164afbMike Reed     and are handling any looping from the paint, and any effects from the
70986480a71f4e860663ced7ad90a1fe346a164afbMike Reed     DrawFilter.
71986480a71f4e860663ced7ad90a1fe346a164afbMike Reed     */
72a1361364e64138adda3dc5f71d50d7503838bb6dMike Reed    void drawPaint(const SkPaint& paint) override;
73a1361364e64138adda3dc5f71d50d7503838bb6dMike Reed    void drawPoints(SkCanvas::PointMode mode, size_t count,
74986480a71f4e860663ced7ad90a1fe346a164afbMike Reed                            const SkPoint[], const SkPaint& paint) override;
75a1361364e64138adda3dc5f71d50d7503838bb6dMike Reed    void drawRect(const SkRect& r, const SkPaint& paint) override;
76a1361364e64138adda3dc5f71d50d7503838bb6dMike Reed    void drawOval(const SkRect& oval, const SkPaint& paint) override;
77a1361364e64138adda3dc5f71d50d7503838bb6dMike Reed    void drawRRect(const SkRRect& rr, const SkPaint& paint) override;
78986480a71f4e860663ced7ad90a1fe346a164afbMike Reed
79986480a71f4e860663ced7ad90a1fe346a164afbMike Reed    /**
80986480a71f4e860663ced7ad90a1fe346a164afbMike Reed     *  If pathIsMutable, then the implementation is allowed to cast path to a
81986480a71f4e860663ced7ad90a1fe346a164afbMike Reed     *  non-const pointer and modify it in place (as an optimization). Canvas
82986480a71f4e860663ced7ad90a1fe346a164afbMike Reed     *  may do this to implement helpers such as drawOval, by placing a temp
83986480a71f4e860663ced7ad90a1fe346a164afbMike Reed     *  path on the stack to hold the representation of the oval.
84986480a71f4e860663ced7ad90a1fe346a164afbMike Reed     *
85986480a71f4e860663ced7ad90a1fe346a164afbMike Reed     *  If prePathMatrix is not null, it should logically be applied before any
86986480a71f4e860663ced7ad90a1fe346a164afbMike Reed     *  stroking or other effects. If there are no effects on the paint that
87986480a71f4e860663ced7ad90a1fe346a164afbMike Reed     *  affect the geometry/rasterization, then the pre matrix can just be
88986480a71f4e860663ced7ad90a1fe346a164afbMike Reed     *  pre-concated with the current matrix.
89986480a71f4e860663ced7ad90a1fe346a164afbMike Reed     */
90a1361364e64138adda3dc5f71d50d7503838bb6dMike Reed    void drawPath(const SkPath&, const SkPaint&, const SkMatrix* prePathMatrix,
911e18aecd0b5bdb6dea0b0bcebf985a8bb221e6a6Mike Reed                          bool pathIsMutable) override;
92a1361364e64138adda3dc5f71d50d7503838bb6dMike Reed    void drawBitmap(const SkBitmap&, const SkMatrix&, const SkPaint&) override;
93a1361364e64138adda3dc5f71d50d7503838bb6dMike Reed    void drawSprite(const SkBitmap&, int x, int y, const SkPaint&) override;
94986480a71f4e860663ced7ad90a1fe346a164afbMike Reed
95986480a71f4e860663ced7ad90a1fe346a164afbMike Reed    /**
96986480a71f4e860663ced7ad90a1fe346a164afbMike Reed     *  The default impl. will create a bitmap-shader from the bitmap,
97986480a71f4e860663ced7ad90a1fe346a164afbMike Reed     *  and call drawRect with it.
98986480a71f4e860663ced7ad90a1fe346a164afbMike Reed     */
99a1361364e64138adda3dc5f71d50d7503838bb6dMike Reed    void drawBitmapRect(const SkBitmap&, const SkRect*, const SkRect&,
100986480a71f4e860663ced7ad90a1fe346a164afbMike Reed                        const SkPaint&, SkCanvas::SrcRectConstraint) override;
101986480a71f4e860663ced7ad90a1fe346a164afbMike Reed
102986480a71f4e860663ced7ad90a1fe346a164afbMike Reed    /**
103986480a71f4e860663ced7ad90a1fe346a164afbMike Reed     *  Does not handle text decoration.
104986480a71f4e860663ced7ad90a1fe346a164afbMike Reed     *  Decorations (underline and stike-thru) will be handled by SkCanvas.
105986480a71f4e860663ced7ad90a1fe346a164afbMike Reed     */
106a1361364e64138adda3dc5f71d50d7503838bb6dMike Reed    void drawText(const void* text, size_t len, SkScalar x, SkScalar y,
1071e18aecd0b5bdb6dea0b0bcebf985a8bb221e6a6Mike Reed                  const SkPaint&) override;
108a1361364e64138adda3dc5f71d50d7503838bb6dMike Reed    void drawPosText(const void* text, size_t len, const SkScalar pos[],
1091e18aecd0b5bdb6dea0b0bcebf985a8bb221e6a6Mike Reed                     int scalarsPerPos, const SkPoint& offset, const SkPaint& paint) override;
1102f6b5a47a50cdd218bc3302273be3a4a71add8fbMike Reed    void drawVertices(const SkVertices*, SkBlendMode, const SkPaint&) override;
111a1361364e64138adda3dc5f71d50d7503838bb6dMike Reed    void drawDevice(SkBaseDevice*, int x, int y, const SkPaint&) override;
112986480a71f4e860663ced7ad90a1fe346a164afbMike Reed
113986480a71f4e860663ced7ad90a1fe346a164afbMike Reed    ///////////////////////////////////////////////////////////////////////////
114986480a71f4e860663ced7ad90a1fe346a164afbMike Reed
115a1361364e64138adda3dc5f71d50d7503838bb6dMike Reed    void drawSpecial(SkSpecialImage*, int x, int y, const SkPaint&) override;
116986480a71f4e860663ced7ad90a1fe346a164afbMike Reed    sk_sp<SkSpecialImage> makeSpecial(const SkBitmap&) override;
117986480a71f4e860663ced7ad90a1fe346a164afbMike Reed    sk_sp<SkSpecialImage> makeSpecial(const SkImage*) override;
118986480a71f4e860663ced7ad90a1fe346a164afbMike Reed    sk_sp<SkSpecialImage> snapSpecial() override;
119986480a71f4e860663ced7ad90a1fe346a164afbMike Reed
120986480a71f4e860663ced7ad90a1fe346a164afbMike Reed    ///////////////////////////////////////////////////////////////////////////
121986480a71f4e860663ced7ad90a1fe346a164afbMike Reed
122986480a71f4e860663ced7ad90a1fe346a164afbMike Reed    bool onReadPixels(const SkImageInfo&, void*, size_t, int x, int y) override;
123986480a71f4e860663ced7ad90a1fe346a164afbMike Reed    bool onWritePixels(const SkImageInfo&, const void*, size_t, int, int) override;
124986480a71f4e860663ced7ad90a1fe346a164afbMike Reed    bool onPeekPixels(SkPixmap*) override;
125986480a71f4e860663ced7ad90a1fe346a164afbMike Reed    bool onAccessPixels(SkPixmap*) override;
126986480a71f4e860663ced7ad90a1fe346a164afbMike Reed
1277627fa51044e35dc21251f925b56f6dd6887df97Mike Reed    void onSave() override;
1287627fa51044e35dc21251f925b56f6dd6887df97Mike Reed    void onRestore() override;
1297627fa51044e35dc21251f925b56f6dd6887df97Mike Reed    void onClipRect(const SkRect& rect, SkClipOp, bool aa) override;
1307627fa51044e35dc21251f925b56f6dd6887df97Mike Reed    void onClipRRect(const SkRRect& rrect, SkClipOp, bool aa) override;
1317627fa51044e35dc21251f925b56f6dd6887df97Mike Reed    void onClipPath(const SkPath& path, SkClipOp, bool aa) override;
1327627fa51044e35dc21251f925b56f6dd6887df97Mike Reed    void onClipRegion(const SkRegion& deviceRgn, SkClipOp) override;
133c42a1cdd1de7a3cf57a9a5fd7363f5fb660e97d0Mike Reed    void onSetDeviceClipRestriction(SkIRect* mutableClipRestriction) override;
134a1361364e64138adda3dc5f71d50d7503838bb6dMike Reed    bool onClipIsAA() const override;
135a1361364e64138adda3dc5f71d50d7503838bb6dMike Reed    void onAsRgnClip(SkRegion*) const override;
136c42a1cdd1de7a3cf57a9a5fd7363f5fb660e97d0Mike Reed    void validateDevBounds(const SkIRect& r) override;
137a1361364e64138adda3dc5f71d50d7503838bb6dMike Reed    ClipType onGetClipType() const override;
1387627fa51044e35dc21251f925b56f6dd6887df97Mike Reed
139986480a71f4e860663ced7ad90a1fe346a164afbMike Reedprivate:
140986480a71f4e860663ced7ad90a1fe346a164afbMike Reed    friend class SkCanvas;
141986480a71f4e860663ced7ad90a1fe346a164afbMike Reed    friend struct DeviceCM; //for setMatrixClip
142986480a71f4e860663ced7ad90a1fe346a164afbMike Reed    friend class SkDraw;
143986480a71f4e860663ced7ad90a1fe346a164afbMike Reed    friend class SkDrawIter;
144986480a71f4e860663ced7ad90a1fe346a164afbMike Reed    friend class SkDeviceFilteredPaint;
14527d07f0acb85eea4062075dfbe9148ce12d92c66Mike Reed    friend class SkSurface_Raster;
146025e2444c1f5a0c3cdc0bf60d1fa59941a0b5db4Mike Reed
147a1361364e64138adda3dc5f71d50d7503838bb6dMike Reed    class BDDraw;
148a1361364e64138adda3dc5f71d50d7503838bb6dMike Reed
149986480a71f4e860663ced7ad90a1fe346a164afbMike Reed    // used to change the backend's pixels (and possibly config/rowbytes)
150986480a71f4e860663ced7ad90a1fe346a164afbMike Reed    // but cannot change the width/height, so there should be no change to
151986480a71f4e860663ced7ad90a1fe346a164afbMike Reed    // any clip information.
152986480a71f4e860663ced7ad90a1fe346a164afbMike Reed    void replaceBitmapBackendForRasterSurface(const SkBitmap&) override;
153986480a71f4e860663ced7ad90a1fe346a164afbMike Reed
154986480a71f4e860663ced7ad90a1fe346a164afbMike Reed    SkBaseDevice* onCreateDevice(const CreateInfo&, const SkPaint*) override;
155986480a71f4e860663ced7ad90a1fe346a164afbMike Reed
156986480a71f4e860663ced7ad90a1fe346a164afbMike Reed    sk_sp<SkSurface> makeSurface(const SkImageInfo&, const SkSurfaceProps&) override;
157986480a71f4e860663ced7ad90a1fe346a164afbMike Reed
158986480a71f4e860663ced7ad90a1fe346a164afbMike Reed    SkImageFilterCache* getImageFilterCache() override;
159986480a71f4e860663ced7ad90a1fe346a164afbMike Reed
160986480a71f4e860663ced7ad90a1fe346a164afbMike Reed    SkBitmap    fBitmap;
161986480a71f4e860663ced7ad90a1fe346a164afbMike Reed    void*       fRasterHandle = nullptr;
162c42a1cdd1de7a3cf57a9a5fd7363f5fb660e97d0Mike Reed    SkRasterClipStack  fRCStack;
163986480a71f4e860663ced7ad90a1fe346a164afbMike Reed
164986480a71f4e860663ced7ad90a1fe346a164afbMike Reed    typedef SkBaseDevice INHERITED;
165986480a71f4e860663ced7ad90a1fe346a164afbMike Reed};
1669241e33ca900c5fd8f902829255f381f8e6e17c8robertphillips@google.com
1679241e33ca900c5fd8f902829255f381f8e6e17c8robertphillips@google.com#endif // SkBitmapDevice_DEFINED
168