OLD | NEW |
1 /* | 1 /* |
2 * Copyright 2006 The Android Open Source Project | 2 * Copyright 2006 The Android Open Source Project |
3 * | 3 * |
4 * Use of this source code is governed by a BSD-style license that can be | 4 * Use of this source code is governed by a BSD-style license that can be |
5 * found in the LICENSE file. | 5 * found in the LICENSE file. |
6 */ | 6 */ |
7 | 7 |
8 #ifndef SkBlitter_DEFINED | 8 #ifndef SkBlitter_DEFINED |
9 #define SkBlitter_DEFINED | 9 #define SkBlitter_DEFINED |
10 | 10 |
11 #include "SkBitmap.h" | |
12 #include "SkBitmapProcShader.h" | 11 #include "SkBitmapProcShader.h" |
13 #include "SkMask.h" | 12 #include "SkMask.h" |
14 #include "SkMatrix.h" | 13 #include "SkMatrix.h" |
15 #include "SkPaint.h" | 14 #include "SkPaint.h" |
| 15 #include "SkPixmap.h" |
16 #include "SkRefCnt.h" | 16 #include "SkRefCnt.h" |
17 #include "SkRegion.h" | 17 #include "SkRegion.h" |
18 #include "SkShader.h" | 18 #include "SkShader.h" |
19 #include "SkSmallAllocator.h" | 19 #include "SkSmallAllocator.h" |
20 | 20 |
21 /** SkBlitter and its subclasses are responsible for actually writing pixels | 21 /** SkBlitter and its subclasses are responsible for actually writing pixels |
22 into memory. Besides efficiency, they handle clipping and antialiasing. | 22 into memory. Besides efficiency, they handle clipping and antialiasing. |
23 */ | 23 */ |
24 class SkBlitter { | 24 class SkBlitter { |
25 public: | 25 public: |
(...skipping 18 matching lines...) Expand all Loading... |
44 virtual void blitAntiRect(int x, int y, int width, int height, | 44 virtual void blitAntiRect(int x, int y, int width, int height, |
45 SkAlpha leftAlpha, SkAlpha rightAlpha); | 45 SkAlpha leftAlpha, SkAlpha rightAlpha); |
46 /// Blit a pattern of pixels defined by a rectangle-clipped mask; | 46 /// Blit a pattern of pixels defined by a rectangle-clipped mask; |
47 /// typically used for text. | 47 /// typically used for text. |
48 virtual void blitMask(const SkMask&, const SkIRect& clip); | 48 virtual void blitMask(const SkMask&, const SkIRect& clip); |
49 | 49 |
50 /** If the blitter just sets a single value for each pixel, return the | 50 /** If the blitter just sets a single value for each pixel, return the |
51 bitmap it draws into, and assign value. If not, return NULL and ignore | 51 bitmap it draws into, and assign value. If not, return NULL and ignore |
52 the value parameter. | 52 the value parameter. |
53 */ | 53 */ |
54 virtual const SkBitmap* justAnOpaqueColor(uint32_t* value); | 54 virtual const SkPixmap* justAnOpaqueColor(uint32_t* value); |
55 | 55 |
56 // (x, y), (x + 1, y) | 56 // (x, y), (x + 1, y) |
57 virtual void blitAntiH2(int x, int y, U8CPU a0, U8CPU a1) { | 57 virtual void blitAntiH2(int x, int y, U8CPU a0, U8CPU a1) { |
58 int16_t runs[3]; | 58 int16_t runs[3]; |
59 uint8_t aa[2]; | 59 uint8_t aa[2]; |
60 | 60 |
61 runs[0] = 1; | 61 runs[0] = 1; |
62 runs[1] = 1; | 62 runs[1] = 1; |
63 runs[2] = 0; | 63 runs[2] = 0; |
64 aa[0] = SkToU8(a0); | 64 aa[0] = SkToU8(a0); |
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
115 | 115 |
116 ///@name non-virtual helpers | 116 ///@name non-virtual helpers |
117 void blitMaskRegion(const SkMask& mask, const SkRegion& clip); | 117 void blitMaskRegion(const SkMask& mask, const SkRegion& clip); |
118 void blitRectRegion(const SkIRect& rect, const SkRegion& clip); | 118 void blitRectRegion(const SkIRect& rect, const SkRegion& clip); |
119 void blitRegion(const SkRegion& clip); | 119 void blitRegion(const SkRegion& clip); |
120 ///@} | 120 ///@} |
121 | 121 |
122 /** @name Factories | 122 /** @name Factories |
123 Return the correct blitter to use given the specified context. | 123 Return the correct blitter to use given the specified context. |
124 */ | 124 */ |
125 static SkBlitter* Choose(const SkBitmap& device, | 125 static SkBlitter* Choose(const SkPixmap& dst, |
126 const SkMatrix& matrix, | 126 const SkMatrix& matrix, |
127 const SkPaint& paint, | 127 const SkPaint& paint, |
128 SkTBlitterAllocator*, | 128 SkTBlitterAllocator*, |
129 bool drawCoverage = false); | 129 bool drawCoverage = false); |
130 | 130 |
131 static SkBlitter* ChooseSprite(const SkPixmap& dst, | 131 static SkBlitter* ChooseSprite(const SkPixmap& dst, |
132 const SkPaint&, | 132 const SkPaint&, |
133 const SkPixmap& src, | 133 const SkPixmap& src, |
134 int left, int top, | 134 int left, int top, |
135 SkTBlitterAllocator*); | 135 SkTBlitterAllocator*); |
136 ///@} | 136 ///@} |
137 | 137 |
138 protected: | 138 protected: |
139 | 139 |
140 SkAutoMalloc fBlitMemory; | 140 SkAutoMalloc fBlitMemory; |
141 | 141 |
142 private: | 142 private: |
143 }; | 143 }; |
144 | 144 |
145 /** This blitter silently never draws anything. | 145 /** This blitter silently never draws anything. |
146 */ | 146 */ |
147 class SkNullBlitter : public SkBlitter { | 147 class SkNullBlitter : public SkBlitter { |
148 public: | 148 public: |
149 void blitH(int x, int y, int width) override; | 149 void blitH(int x, int y, int width) override; |
150 virtual void blitAntiH(int x, int y, const SkAlpha[], | 150 virtual void blitAntiH(int x, int y, const SkAlpha[], |
151 const int16_t runs[]) override; | 151 const int16_t runs[]) override; |
152 void blitV(int x, int y, int height, SkAlpha alpha) override; | 152 void blitV(int x, int y, int height, SkAlpha alpha) override; |
153 void blitRect(int x, int y, int width, int height) override; | 153 void blitRect(int x, int y, int width, int height) override; |
154 void blitMask(const SkMask&, const SkIRect& clip) override; | 154 void blitMask(const SkMask&, const SkIRect& clip) override; |
155 const SkBitmap* justAnOpaqueColor(uint32_t* value) override; | 155 const SkPixmap* justAnOpaqueColor(uint32_t* value) override; |
156 bool isNullBlitter() const override; | 156 bool isNullBlitter() const override; |
157 }; | 157 }; |
158 | 158 |
159 /** Wraps another (real) blitter, and ensures that the real blitter is only | 159 /** Wraps another (real) blitter, and ensures that the real blitter is only |
160 called with coordinates that have been clipped by the specified clipRect. | 160 called with coordinates that have been clipped by the specified clipRect. |
161 This means the caller need not perform the clipping ahead of time. | 161 This means the caller need not perform the clipping ahead of time. |
162 */ | 162 */ |
163 class SkRectClipBlitter : public SkBlitter { | 163 class SkRectClipBlitter : public SkBlitter { |
164 public: | 164 public: |
165 void init(SkBlitter* blitter, const SkIRect& clipRect) { | 165 void init(SkBlitter* blitter, const SkIRect& clipRect) { |
166 SkASSERT(!clipRect.isEmpty()); | 166 SkASSERT(!clipRect.isEmpty()); |
167 fBlitter = blitter; | 167 fBlitter = blitter; |
168 fClipRect = clipRect; | 168 fClipRect = clipRect; |
169 } | 169 } |
170 | 170 |
171 void blitH(int x, int y, int width) override; | 171 void blitH(int x, int y, int width) override; |
172 virtual void blitAntiH(int x, int y, const SkAlpha[], | 172 virtual void blitAntiH(int x, int y, const SkAlpha[], |
173 const int16_t runs[]) override; | 173 const int16_t runs[]) override; |
174 void blitV(int x, int y, int height, SkAlpha alpha) override; | 174 void blitV(int x, int y, int height, SkAlpha alpha) override; |
175 void blitRect(int x, int y, int width, int height) override; | 175 void blitRect(int x, int y, int width, int height) override; |
176 virtual void blitAntiRect(int x, int y, int width, int height, | 176 virtual void blitAntiRect(int x, int y, int width, int height, |
177 SkAlpha leftAlpha, SkAlpha rightAlpha) override; | 177 SkAlpha leftAlpha, SkAlpha rightAlpha) override; |
178 void blitMask(const SkMask&, const SkIRect& clip) override; | 178 void blitMask(const SkMask&, const SkIRect& clip) override; |
179 const SkBitmap* justAnOpaqueColor(uint32_t* value) override; | 179 const SkPixmap* justAnOpaqueColor(uint32_t* value) override; |
180 | 180 |
181 int requestRowsPreserved() const override { | 181 int requestRowsPreserved() const override { |
182 return fBlitter->requestRowsPreserved(); | 182 return fBlitter->requestRowsPreserved(); |
183 } | 183 } |
184 | 184 |
185 void* allocBlitMemory(size_t sz) override { | 185 void* allocBlitMemory(size_t sz) override { |
186 return fBlitter->allocBlitMemory(sz); | 186 return fBlitter->allocBlitMemory(sz); |
187 } | 187 } |
188 | 188 |
189 private: | 189 private: |
(...skipping 14 matching lines...) Expand all Loading... |
204 } | 204 } |
205 | 205 |
206 void blitH(int x, int y, int width) override; | 206 void blitH(int x, int y, int width) override; |
207 virtual void blitAntiH(int x, int y, const SkAlpha[], | 207 virtual void blitAntiH(int x, int y, const SkAlpha[], |
208 const int16_t runs[]) override; | 208 const int16_t runs[]) override; |
209 void blitV(int x, int y, int height, SkAlpha alpha) override; | 209 void blitV(int x, int y, int height, SkAlpha alpha) override; |
210 void blitRect(int x, int y, int width, int height) override; | 210 void blitRect(int x, int y, int width, int height) override; |
211 virtual void blitAntiRect(int x, int y, int width, int height, | 211 virtual void blitAntiRect(int x, int y, int width, int height, |
212 SkAlpha leftAlpha, SkAlpha rightAlpha) override; | 212 SkAlpha leftAlpha, SkAlpha rightAlpha) override; |
213 void blitMask(const SkMask&, const SkIRect& clip) override; | 213 void blitMask(const SkMask&, const SkIRect& clip) override; |
214 const SkBitmap* justAnOpaqueColor(uint32_t* value) override; | 214 const SkPixmap* justAnOpaqueColor(uint32_t* value) override; |
215 | 215 |
216 int requestRowsPreserved() const override { | 216 int requestRowsPreserved() const override { |
217 return fBlitter->requestRowsPreserved(); | 217 return fBlitter->requestRowsPreserved(); |
218 } | 218 } |
219 | 219 |
220 void* allocBlitMemory(size_t sz) override { | 220 void* allocBlitMemory(size_t sz) override { |
221 return fBlitter->allocBlitMemory(sz); | 221 return fBlitter->allocBlitMemory(sz); |
222 } | 222 } |
223 | 223 |
224 private: | 224 private: |
(...skipping 10 matching lines...) Expand all Loading... |
235 SkBlitter* apply(SkBlitter* blitter, const SkRegion* clip, | 235 SkBlitter* apply(SkBlitter* blitter, const SkRegion* clip, |
236 const SkIRect* bounds = NULL); | 236 const SkIRect* bounds = NULL); |
237 | 237 |
238 private: | 238 private: |
239 SkNullBlitter fNullBlitter; | 239 SkNullBlitter fNullBlitter; |
240 SkRectClipBlitter fRectBlitter; | 240 SkRectClipBlitter fRectBlitter; |
241 SkRgnClipBlitter fRgnBlitter; | 241 SkRgnClipBlitter fRgnBlitter; |
242 }; | 242 }; |
243 | 243 |
244 #endif | 244 #endif |
OLD | NEW |