Line data Source code
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 177 : 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;
65 0 : 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 : friend class SkThreadedBMPDevice; // to copy fRCStack
147 :
148 : class BDDraw;
149 :
150 : // used to change the backend's pixels (and possibly config/rowbytes)
151 : // but cannot change the width/height, so there should be no change to
152 : // any clip information.
153 : void replaceBitmapBackendForRasterSurface(const SkBitmap&) override;
154 :
155 : SkBaseDevice* onCreateDevice(const CreateInfo&, const SkPaint*) override;
156 :
157 : sk_sp<SkSurface> makeSurface(const SkImageInfo&, const SkSurfaceProps&) override;
158 :
159 : SkImageFilterCache* getImageFilterCache() override;
160 :
161 : SkBitmap fBitmap;
162 : void* fRasterHandle = nullptr;
163 : SkRasterClipStack fRCStack;
164 :
165 : typedef SkBaseDevice INHERITED;
166 : };
167 :
168 : #endif // SkBitmapDevice_DEFINED
|