• 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&, const SkMatrix&, 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&) override;
116     sk_sp<SkSpecialImage> makeSpecial(const SkBitmap&) override;
117     sk_sp<SkSpecialImage> makeSpecial(const SkImage*) override;
118     sk_sp<SkSpecialImage> snapSpecial() override;
119 
120     ///////////////////////////////////////////////////////////////////////////
121 
122     bool onReadPixels(const SkImageInfo&, void*, size_t, int x, int y) override;
123     bool onWritePixels(const SkImageInfo&, const void*, size_t, int, int) override;
124     bool onPeekPixels(SkPixmap*) override;
125     bool onAccessPixels(SkPixmap*) override;
126 
127     void onSave() override;
128     void onRestore() override;
129     void onClipRect(const SkRect& rect, SkClipOp, bool aa) override;
130     void onClipRRect(const SkRRect& rrect, SkClipOp, bool aa) override;
131     void onClipPath(const SkPath& path, SkClipOp, bool aa) override;
132     void onClipRegion(const SkRegion& deviceRgn, SkClipOp) override;
133     void onSetDeviceClipRestriction(SkIRect* mutableClipRestriction) override;
134     bool onClipIsAA() const override;
135     void onAsRgnClip(SkRegion*) const override;
136     void validateDevBounds(const SkIRect& r) override;
137     ClipType onGetClipType() const override;
138 
139 private:
140     friend class SkCanvas;
141     friend struct DeviceCM; //for setMatrixClip
142     friend class SkDraw;
143     friend class SkDrawIter;
144     friend class SkDeviceFilteredPaint;
145     friend class SkSurface_Raster;
146 
147     class BDDraw;
148 
149     // used to change the backend's pixels (and possibly config/rowbytes)
150     // but cannot change the width/height, so there should be no change to
151     // any clip information.
152     void replaceBitmapBackendForRasterSurface(const SkBitmap&) override;
153 
154     SkBaseDevice* onCreateDevice(const CreateInfo&, const SkPaint*) override;
155 
156     sk_sp<SkSurface> makeSurface(const SkImageInfo&, const SkSurfaceProps&) override;
157 
158     SkImageFilterCache* getImageFilterCache() override;
159 
160     SkBitmap    fBitmap;
161     void*       fRasterHandle = nullptr;
162     SkRasterClipStack  fRCStack;
163 
164     typedef SkBaseDevice INHERITED;
165 };
166 
167 #endif // SkBitmapDevice_DEFINED
168