• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright 2013 Google Inc.
3  *
4  * Use of this source code is governed by a BSD-style license that can be
5  * found in the LICENSE file.
6  */
7 
8 #ifndef SkBitmapDevice_DEFINED
9 #define SkBitmapDevice_DEFINED
10 
11 #include "SkBitmap.h"
12 #include "SkCanvas.h"
13 #include "SkColor.h"
14 #include "SkDevice.h"
15 #include "SkImageInfo.h"
16 #include "SkPixelRef.h"
17 #include "SkRasterClip.h"
18 #include "SkRasterClipStack.h"
19 #include "SkRect.h"
20 #include "SkScalar.h"
21 #include "SkSize.h"
22 #include "SkSurfaceProps.h"
23 
24 class SkImageFilterCache;
25 class SkMatrix;
26 class SkPaint;
27 class SkPath;
28 class SkPixelRef;
29 class SkPixmap;
30 class SkRasterHandleAllocator;
31 class SkRRect;
32 class SkSurface;
33 struct SkPoint;
34 
35 ///////////////////////////////////////////////////////////////////////////////
36 class SK_API SkBitmapDevice : public SkBaseDevice {
37 public:
38     /**
39      *  Construct a new device with the specified bitmap as its backend. It is
40      *  valid for the bitmap to have no pixels associated with it. In that case,
41      *  any drawing to this device will have no effect.
42      */
43     SkBitmapDevice(const SkBitmap& bitmap);
44 
45     /**
46      * Create a new device along with its requisite pixel memory using
47      * default SkSurfaceProps (i.e., kLegacyFontHost_InitType-style).
48      * Note: this entry point is slated for removal - no one should call it.
49      */
50     static SkBitmapDevice* Create(const SkImageInfo& info);
51 
52     /**
53      *  Construct a new device with the specified bitmap as its backend. It is
54      *  valid for the bitmap to have no pixels associated with it. In that case,
55      *  any drawing to this device will have no effect.
56      */
57     SkBitmapDevice(const SkBitmap& bitmap, const SkSurfaceProps& surfaceProps,
58                    void* externalHandle = nullptr);
59 
60     static SkBitmapDevice* Create(const SkImageInfo&, const SkSurfaceProps&,
61                                   SkRasterHandleAllocator* = nullptr);
62 
63 protected:
64     bool onShouldDisableLCD(const SkPaint&) const override;
getRasterHandle()65     void* getRasterHandle() const override { return fRasterHandle; }
66 
67     /** These are called inside the per-device-layer loop for each draw call.
68      When these are called, we have already applied any saveLayer operations,
69      and are handling any looping from the paint, and any effects from the
70      DrawFilter.
71      */
72     void drawPaint(const SkPaint& paint) override;
73     void drawPoints(SkCanvas::PointMode mode, size_t count,
74                             const SkPoint[], const SkPaint& paint) override;
75     void drawRect(const SkRect& r, const SkPaint& paint) override;
76     void drawOval(const SkRect& oval, const SkPaint& paint) override;
77     void drawRRect(const SkRRect& rr, const SkPaint& paint) override;
78 
79     /**
80      *  If pathIsMutable, then the implementation is allowed to cast path to a
81      *  non-const pointer and modify it in place (as an optimization). Canvas
82      *  may do this to implement helpers such as drawOval, by placing a temp
83      *  path on the stack to hold the representation of the oval.
84      *
85      *  If prePathMatrix is not null, it should logically be applied before any
86      *  stroking or other effects. If there are no effects on the paint that
87      *  affect the geometry/rasterization, then the pre matrix can just be
88      *  pre-concated with the current matrix.
89      */
90     void drawPath(const SkPath&, const SkPaint&, const SkMatrix* prePathMatrix,
91                           bool pathIsMutable) override;
92     void drawBitmap(const SkBitmap&, SkScalar x, SkScalar y, const SkPaint&) override;
93     void drawSprite(const SkBitmap&, int x, int y, const SkPaint&) override;
94 
95     /**
96      *  The default impl. will create a bitmap-shader from the bitmap,
97      *  and call drawRect with it.
98      */
99     void drawBitmapRect(const SkBitmap&, const SkRect*, const SkRect&,
100                         const SkPaint&, SkCanvas::SrcRectConstraint) override;
101 
102     /**
103      *  Does not handle text decoration.
104      *  Decorations (underline and stike-thru) will be handled by SkCanvas.
105      */
106     void drawText(const void* text, size_t len, SkScalar x, SkScalar y,
107                   const SkPaint&) override;
108     void drawPosText(const void* text, size_t len, const SkScalar pos[],
109                      int scalarsPerPos, const SkPoint& offset, const SkPaint& paint) override;
110     void drawVertices(const SkVertices*, SkBlendMode, const SkPaint&) override;
111     void drawDevice(SkBaseDevice*, int x, int y, const SkPaint&) override;
112 
113     ///////////////////////////////////////////////////////////////////////////
114 
115     void drawSpecial(SkSpecialImage*, int x, int y, const SkPaint&,
116                      SkImage*, const SkMatrix&) override;
117     sk_sp<SkSpecialImage> makeSpecial(const SkBitmap&) override;
118     sk_sp<SkSpecialImage> makeSpecial(const SkImage*) override;
119     sk_sp<SkSpecialImage> snapSpecial() override;
120 
121     ///////////////////////////////////////////////////////////////////////////
122 
123     bool onReadPixels(const SkImageInfo&, void*, size_t, int x, int y) override;
124     bool onWritePixels(const SkImageInfo&, const void*, size_t, int, int) override;
125     bool onPeekPixels(SkPixmap*) override;
126     bool onAccessPixels(SkPixmap*) override;
127 
128     void onSave() override;
129     void onRestore() override;
130     void onClipRect(const SkRect& rect, SkClipOp, bool aa) override;
131     void onClipRRect(const SkRRect& rrect, SkClipOp, bool aa) override;
132     void onClipPath(const SkPath& path, SkClipOp, bool aa) override;
133     void onClipRegion(const SkRegion& deviceRgn, SkClipOp) override;
134     void onSetDeviceClipRestriction(SkIRect* mutableClipRestriction) override;
135     bool onClipIsAA() const override;
136     void onAsRgnClip(SkRegion*) const override;
137     void validateDevBounds(const SkIRect& r) override;
138     ClipType onGetClipType() const override;
139 
140 private:
141     friend class SkCanvas;
142     friend struct DeviceCM; //for setMatrixClip
143     friend class SkDraw;
144     friend class SkDrawIter;
145     friend class SkDeviceFilteredPaint;
146     friend class SkSurface_Raster;
147     friend class SkThreadedBMPDevice; // to copy fRCStack
148 
149     class BDDraw;
150 
151     // used to change the backend's pixels (and possibly config/rowbytes)
152     // but cannot change the width/height, so there should be no change to
153     // any clip information.
154     void replaceBitmapBackendForRasterSurface(const SkBitmap&) override;
155 
156     SkBaseDevice* onCreateDevice(const CreateInfo&, const SkPaint*) override;
157 
158     sk_sp<SkSurface> makeSurface(const SkImageInfo&, const SkSurfaceProps&) override;
159 
160     SkImageFilterCache* getImageFilterCache() override;
161 
162     SkBitmap    fBitmap;
163     void*       fRasterHandle = nullptr;
164     SkRasterClipStack  fRCStack;
165 
166     typedef SkBaseDevice INHERITED;
167 };
168 
169 #endif // SkBitmapDevice_DEFINED
170