OLD | NEW |
1 | 1 |
2 /* | 2 /* |
3 * Copyright 2011 Google Inc. | 3 * Copyright 2011 Google Inc. |
4 * | 4 * |
5 * Use of this source code is governed by a BSD-style license that can be | 5 * Use of this source code is governed by a BSD-style license that can be |
6 * found in the LICENSE file. | 6 * found in the LICENSE file. |
7 */ | 7 */ |
8 #include "SkDevice.h" | 8 #include "SkDevice.h" |
9 #include "SkDeviceProperties.h" | 9 #include "SkDeviceProperties.h" |
10 #include "SkDraw.h" | 10 #include "SkDraw.h" |
11 #include "SkImageFilter.h" | 11 #include "SkImageFilter.h" |
12 #include "SkMetaData.h" | 12 #include "SkMetaData.h" |
13 #include "SkRasterClip.h" | 13 #include "SkRasterClip.h" |
14 #include "SkRect.h" | 14 #include "SkRect.h" |
15 #include "SkRRect.h" | 15 #include "SkRRect.h" |
16 #include "SkShader.h" | 16 #include "SkShader.h" |
17 | 17 |
18 SK_DEFINE_INST_COUNT(SkDevice) | 18 SK_DEFINE_INST_COUNT(SkBaseDevice) |
| 19 SK_DEFINE_INST_COUNT(SkBitmapDevice) |
19 | 20 |
20 /////////////////////////////////////////////////////////////////////////////// | 21 /////////////////////////////////////////////////////////////////////////////// |
21 | 22 |
22 #define CHECK_FOR_NODRAW_ANNOTATION(paint) \ | 23 #define CHECK_FOR_NODRAW_ANNOTATION(paint) \ |
23 do { if (paint.isNoDrawAnnotation()) { return; } } while (0) | 24 do { if (paint.isNoDrawAnnotation()) { return; } } while (0) |
24 | 25 |
25 /////////////////////////////////////////////////////////////////////////////// | 26 /////////////////////////////////////////////////////////////////////////////// |
26 | 27 |
27 SkDevice::SkDevice(const SkBitmap& bitmap) | 28 SkBitmapDevice::SkBitmapDevice(const SkBitmap& bitmap) |
28 : fBitmap(bitmap), fLeakyProperties(SkDeviceProperties::MakeDefault()) | 29 : fBitmap(bitmap) { |
| 30 SkASSERT(SkBitmap::kARGB_4444_Config != bitmap.config()); |
| 31 } |
| 32 |
| 33 SkBaseDevice::SkBaseDevice() |
| 34 : fLeakyProperties(SkDeviceProperties::MakeDefault()) |
29 #ifdef SK_DEBUG | 35 #ifdef SK_DEBUG |
30 , fAttachedToCanvas(false) | 36 , fAttachedToCanvas(false) |
31 #endif | 37 #endif |
32 { | |
33 fOrigin.setZero(); | |
34 fMetaData = NULL; | |
35 | |
36 SkASSERT(SkBitmap::kARGB_4444_Config != bitmap.config()); | |
37 } | |
38 | |
39 SkDevice::SkDevice(const SkBitmap& bitmap, const SkDeviceProperties& devicePrope
rties) | |
40 : fBitmap(bitmap), fLeakyProperties(deviceProperties) | |
41 #ifdef SK_DEBUG | |
42 , fAttachedToCanvas(false) | |
43 #endif | |
44 { | 38 { |
45 fOrigin.setZero(); | 39 fOrigin.setZero(); |
46 fMetaData = NULL; | 40 fMetaData = NULL; |
47 } | 41 } |
48 | 42 |
49 SkDevice::SkDevice(SkBitmap::Config config, int width, int height, bool isOpaque
) | 43 SkBitmapDevice::SkBitmapDevice(const SkBitmap& bitmap, const SkDeviceProperties&
deviceProperties) |
50 : fLeakyProperties(SkDeviceProperties::MakeDefault()) | 44 : SkBaseDevice(deviceProperties) |
| 45 , fBitmap(bitmap) { |
| 46 } |
| 47 |
| 48 SkBaseDevice::SkBaseDevice(const SkDeviceProperties& deviceProperties) |
| 49 : fLeakyProperties(deviceProperties) |
51 #ifdef SK_DEBUG | 50 #ifdef SK_DEBUG |
52 , fAttachedToCanvas(false) | 51 , fAttachedToCanvas(false) |
53 #endif | 52 #endif |
54 { | 53 { |
55 fOrigin.setZero(); | 54 fOrigin.setZero(); |
56 fMetaData = NULL; | 55 fMetaData = NULL; |
| 56 } |
57 | 57 |
| 58 SkBitmapDevice::SkBitmapDevice(SkBitmap::Config config, int width, int height, b
ool isOpaque) { |
58 fBitmap.setConfig(config, width, height); | 59 fBitmap.setConfig(config, width, height); |
59 fBitmap.allocPixels(); | 60 fBitmap.allocPixels(); |
60 fBitmap.setIsOpaque(isOpaque); | 61 fBitmap.setIsOpaque(isOpaque); |
61 if (!isOpaque) { | 62 if (!isOpaque) { |
62 fBitmap.eraseColor(SK_ColorTRANSPARENT); | 63 fBitmap.eraseColor(SK_ColorTRANSPARENT); |
63 } | 64 } |
64 } | 65 } |
65 | 66 |
66 SkDevice::SkDevice(SkBitmap::Config config, int width, int height, bool isOpaque
, | 67 SkBitmapDevice::SkBitmapDevice(SkBitmap::Config config, int width, int height, b
ool isOpaque, |
67 const SkDeviceProperties& deviceProperties) | 68 const SkDeviceProperties& deviceProperties) |
68 : fLeakyProperties(deviceProperties) | 69 : SkBaseDevice(deviceProperties) { |
69 #ifdef SK_DEBUG | |
70 , fAttachedToCanvas(false) | |
71 #endif | |
72 { | |
73 fOrigin.setZero(); | |
74 fMetaData = NULL; | |
75 | 70 |
76 fBitmap.setConfig(config, width, height); | 71 fBitmap.setConfig(config, width, height); |
77 fBitmap.allocPixels(); | 72 fBitmap.allocPixels(); |
78 fBitmap.setIsOpaque(isOpaque); | 73 fBitmap.setIsOpaque(isOpaque); |
79 if (!isOpaque) { | 74 if (!isOpaque) { |
80 fBitmap.eraseColor(SK_ColorTRANSPARENT); | 75 fBitmap.eraseColor(SK_ColorTRANSPARENT); |
81 } | 76 } |
82 } | 77 } |
83 | 78 |
84 SkDevice::~SkDevice() { | 79 SkBaseDevice::~SkBaseDevice() { |
85 delete fMetaData; | 80 delete fMetaData; |
86 } | 81 } |
87 | 82 |
88 void SkDevice::replaceBitmapBackendForRasterSurface(const SkBitmap& bm) { | 83 SkBitmapDevice::~SkBitmapDevice() { |
| 84 } |
| 85 |
| 86 void SkBitmapDevice::replaceBitmapBackendForRasterSurface(const SkBitmap& bm) { |
89 SkASSERT(bm.width() == fBitmap.width()); | 87 SkASSERT(bm.width() == fBitmap.width()); |
90 SkASSERT(bm.height() == fBitmap.height()); | 88 SkASSERT(bm.height() == fBitmap.height()); |
91 fBitmap = bm; // intent is to use bm's pixelRef (and rowbytes/config) | 89 fBitmap = bm; // intent is to use bm's pixelRef (and rowbytes/config) |
92 fBitmap.lockPixels(); | 90 fBitmap.lockPixels(); |
93 } | 91 } |
94 | 92 |
95 SkDevice* SkDevice::createCompatibleDevice(SkBitmap::Config config, | 93 SkBaseDevice* SkBaseDevice::createCompatibleDevice(SkBitmap::Config config, |
96 int width, int height, | 94 int width, int height, |
97 bool isOpaque) { | 95 bool isOpaque) { |
98 return this->onCreateCompatibleDevice(config, width, height, | 96 return this->onCreateCompatibleDevice(config, width, height, |
99 isOpaque, kGeneral_Usage); | 97 isOpaque, kGeneral_Usage); |
100 } | 98 } |
101 | 99 |
102 SkDevice* SkDevice::createCompatibleDeviceForSaveLayer(SkBitmap::Config config, | 100 SkBaseDevice* SkBaseDevice::createCompatibleDeviceForSaveLayer(SkBitmap::Config
config, |
103 int width, int height, | 101 int width, int he
ight, |
104 bool isOpaque) { | 102 bool isOpaque) { |
105 return this->onCreateCompatibleDevice(config, width, height, | 103 return this->onCreateCompatibleDevice(config, width, height, |
106 isOpaque, kSaveLayer_Usage); | 104 isOpaque, kSaveLayer_Usage); |
107 } | 105 } |
108 | 106 |
109 SkDevice* SkDevice::onCreateCompatibleDevice(SkBitmap::Config config, | 107 SkBaseDevice* SkBitmapDevice::onCreateCompatibleDevice(SkBitmap::Config config, |
110 int width, int height, | 108 int width, int height, |
111 bool isOpaque, | 109 bool isOpaque, |
112 Usage usage) { | 110 Usage usage) { |
113 return SkNEW_ARGS(SkDevice,(config, width, height, isOpaque, fLeakyPropertie
s)); | 111 return SkNEW_ARGS(SkBitmapDevice,(config, width, height, isOpaque, |
| 112 this->getDeviceProperties())); |
114 } | 113 } |
115 | 114 |
116 SkMetaData& SkDevice::getMetaData() { | 115 SkMetaData& SkBaseDevice::getMetaData() { |
117 // metadata users are rare, so we lazily allocate it. If that changes we | 116 // metadata users are rare, so we lazily allocate it. If that changes we |
118 // can decide to just make it a field in the device (rather than a ptr) | 117 // can decide to just make it a field in the device (rather than a ptr) |
119 if (NULL == fMetaData) { | 118 if (NULL == fMetaData) { |
120 fMetaData = new SkMetaData; | 119 fMetaData = new SkMetaData; |
121 } | 120 } |
122 return *fMetaData; | 121 return *fMetaData; |
123 } | 122 } |
124 | 123 |
125 void SkDevice::lockPixels() { | 124 void SkBitmapDevice::lockPixels() { |
126 if (fBitmap.lockPixelsAreWritable()) { | 125 if (fBitmap.lockPixelsAreWritable()) { |
127 fBitmap.lockPixels(); | 126 fBitmap.lockPixels(); |
128 } | 127 } |
129 } | 128 } |
130 | 129 |
131 void SkDevice::unlockPixels() { | 130 void SkBitmapDevice::unlockPixels() { |
132 if (fBitmap.lockPixelsAreWritable()) { | 131 if (fBitmap.lockPixelsAreWritable()) { |
133 fBitmap.unlockPixels(); | 132 fBitmap.unlockPixels(); |
134 } | 133 } |
135 } | 134 } |
136 | 135 |
137 const SkBitmap& SkDevice::accessBitmap(bool changePixels) { | 136 const SkBitmap& SkBaseDevice::accessBitmap(bool changePixels) { |
138 const SkBitmap& bitmap = this->onAccessBitmap(&fBitmap); | 137 const SkBitmap& bitmap = this->onAccessBitmap(); |
139 if (changePixels) { | 138 if (changePixels) { |
140 bitmap.notifyPixelsChanged(); | 139 bitmap.notifyPixelsChanged(); |
141 } | 140 } |
142 return bitmap; | 141 return bitmap; |
143 } | 142 } |
144 | 143 |
145 void SkDevice::getGlobalBounds(SkIRect* bounds) const { | 144 void SkBitmapDevice::getGlobalBounds(SkIRect* bounds) const { |
146 if (bounds) { | 145 if (bounds) { |
147 bounds->setXYWH(fOrigin.x(), fOrigin.y(), | 146 const SkIPoint& origin = this->getOrigin(); |
| 147 bounds->setXYWH(origin.x(), origin.y(), |
148 fBitmap.width(), fBitmap.height()); | 148 fBitmap.width(), fBitmap.height()); |
149 } | 149 } |
150 } | 150 } |
151 | 151 |
152 void SkDevice::clear(SkColor color) { | 152 void SkBitmapDevice::clear(SkColor color) { |
153 fBitmap.eraseColor(color); | 153 fBitmap.eraseColor(color); |
154 } | 154 } |
155 | 155 |
156 const SkBitmap& SkDevice::onAccessBitmap(SkBitmap* bitmap) {return *bitmap;} | 156 const SkBitmap& SkBitmapDevice::onAccessBitmap() { |
157 | 157 return fBitmap; |
158 void SkDevice::setMatrixClip(const SkMatrix& matrix, const SkRegion& region, | |
159 const SkClipStack& clipStack) { | |
160 } | 158 } |
161 | 159 |
162 bool SkDevice::canHandleImageFilter(SkImageFilter*) { | 160 bool SkBitmapDevice::canHandleImageFilter(SkImageFilter*) { |
163 return false; | 161 return false; |
164 } | 162 } |
165 | 163 |
166 bool SkDevice::filterImage(SkImageFilter* filter, const SkBitmap& src, | 164 bool SkBitmapDevice::filterImage(SkImageFilter* filter, const SkBitmap& src, |
167 const SkMatrix& ctm, SkBitmap* result, | 165 const SkMatrix& ctm, SkBitmap* result, |
168 SkIPoint* offset) { | 166 SkIPoint* offset) { |
169 return false; | 167 return false; |
170 } | 168 } |
171 | 169 |
172 bool SkDevice::allowImageFilter(SkImageFilter*) { | 170 bool SkBitmapDevice::allowImageFilter(SkImageFilter*) { |
173 return true; | 171 return true; |
174 } | 172 } |
175 | 173 |
176 /////////////////////////////////////////////////////////////////////////////// | 174 /////////////////////////////////////////////////////////////////////////////// |
177 | 175 |
178 bool SkDevice::readPixels(SkBitmap* bitmap, int x, int y, | 176 bool SkBaseDevice::readPixels(SkBitmap* bitmap, int x, int y, |
179 SkCanvas::Config8888 config8888) { | 177 SkCanvas::Config8888 config8888) { |
180 if (SkBitmap::kARGB_8888_Config != bitmap->config() || | 178 if (SkBitmap::kARGB_8888_Config != bitmap->config() || |
181 NULL != bitmap->getTexture()) { | 179 NULL != bitmap->getTexture()) { |
182 return false; | 180 return false; |
183 } | 181 } |
184 | 182 |
185 const SkBitmap& src = this->accessBitmap(false); | 183 const SkBitmap& src = this->accessBitmap(false); |
186 | 184 |
187 SkIRect srcRect = SkIRect::MakeXYWH(x, y, bitmap->width(), | 185 SkIRect srcRect = SkIRect::MakeXYWH(x, y, bitmap->width(), |
188 bitmap->height()); | 186 bitmap->height()); |
189 SkIRect devbounds = SkIRect::MakeWH(src.width(), src.height()); | 187 SkIRect devbounds = SkIRect::MakeWH(src.width(), src.height()); |
(...skipping 23 matching lines...) Expand all Loading... |
213 srcRect.fLeft, | 211 srcRect.fLeft, |
214 srcRect.fTop, | 212 srcRect.fTop, |
215 config8888); | 213 config8888); |
216 if (result && bmp == &tmp) { | 214 if (result && bmp == &tmp) { |
217 tmp.swap(*bitmap); | 215 tmp.swap(*bitmap); |
218 } | 216 } |
219 return result; | 217 return result; |
220 } | 218 } |
221 | 219 |
222 #if SK_PMCOLOR_BYTE_ORDER(B,G,R,A) | 220 #if SK_PMCOLOR_BYTE_ORDER(B,G,R,A) |
223 const SkCanvas::Config8888 SkDevice::kPMColorAlias = | 221 const SkCanvas::Config8888 SkBaseDevice::kPMColorAlias = |
224 SkCanvas::kBGRA_Premul_Config8888; | 222 SkCanvas::kBGRA_Premul_Config8888; |
225 #elif SK_PMCOLOR_BYTE_ORDER(R,G,B,A) | 223 #elif SK_PMCOLOR_BYTE_ORDER(R,G,B,A) |
226 const SkCanvas::Config8888 SkDevice::kPMColorAlias = | 224 const SkCanvas::Config8888 SkBaseDevice::kPMColorAlias = |
227 SkCanvas::kRGBA_Premul_Config8888; | 225 SkCanvas::kRGBA_Premul_Config8888; |
228 #else | 226 #else |
229 const SkCanvas::Config8888 SkDevice::kPMColorAlias = | 227 const SkCanvas::Config8888 SkBaseDevice::kPMColorAlias = |
230 (SkCanvas::Config8888) -1; | 228 (SkCanvas::Config8888) -1; |
231 #endif | 229 #endif |
232 | 230 |
233 #include <SkConfig8888.h> | 231 #include <SkConfig8888.h> |
234 | 232 |
235 bool SkDevice::onReadPixels(const SkBitmap& bitmap, | 233 bool SkBitmapDevice::onReadPixels(const SkBitmap& bitmap, |
236 int x, int y, | 234 int x, int y, |
237 SkCanvas::Config8888 config8888) { | 235 SkCanvas::Config8888 config8888) { |
238 SkASSERT(SkBitmap::kARGB_8888_Config == bitmap.config()); | 236 SkASSERT(SkBitmap::kARGB_8888_Config == bitmap.config()); |
239 SkASSERT(!bitmap.isNull()); | 237 SkASSERT(!bitmap.isNull()); |
240 SkASSERT(SkIRect::MakeWH(this->width(), this->height()).contains(SkIRect::Ma
keXYWH(x, y, bitmap.width(), bitmap.height()))); | 238 SkASSERT(SkIRect::MakeWH(this->width(), this->height()).contains(SkIRect::Ma
keXYWH(x, y, bitmap.width(), bitmap.height()))); |
241 | 239 |
242 SkIRect srcRect = SkIRect::MakeXYWH(x, y, bitmap.width(), | 240 SkIRect srcRect = SkIRect::MakeXYWH(x, y, bitmap.width(), |
243 bitmap.height()); | 241 bitmap.height()); |
244 const SkBitmap& src = this->accessBitmap(false); | 242 const SkBitmap& src = this->accessBitmap(false); |
245 | 243 |
246 SkBitmap subset; | 244 SkBitmap subset; |
247 if (!src.extractSubset(&subset, srcRect)) { | 245 if (!src.extractSubset(&subset, srcRect)) { |
248 return false; | 246 return false; |
249 } | 247 } |
250 if (SkBitmap::kARGB_8888_Config != subset.config()) { | 248 if (SkBitmap::kARGB_8888_Config != subset.config()) { |
251 // It'd be preferable to do this directly to bitmap. | 249 // It'd be preferable to do this directly to bitmap. |
252 subset.copyTo(&subset, SkBitmap::kARGB_8888_Config); | 250 subset.copyTo(&subset, SkBitmap::kARGB_8888_Config); |
253 } | 251 } |
254 SkAutoLockPixels alp(bitmap); | 252 SkAutoLockPixels alp(bitmap); |
255 uint32_t* bmpPixels = reinterpret_cast<uint32_t*>(bitmap.getPixels()); | 253 uint32_t* bmpPixels = reinterpret_cast<uint32_t*>(bitmap.getPixels()); |
256 SkCopyBitmapToConfig8888(bmpPixels, bitmap.rowBytes(), config8888, subset); | 254 SkCopyBitmapToConfig8888(bmpPixels, bitmap.rowBytes(), config8888, subset); |
257 return true; | 255 return true; |
258 } | 256 } |
259 | 257 |
260 void SkDevice::writePixels(const SkBitmap& bitmap, | 258 void SkBitmapDevice::writePixels(const SkBitmap& bitmap, |
261 int x, int y, | 259 int x, int y, |
262 SkCanvas::Config8888 config8888) { | 260 SkCanvas::Config8888 config8888) { |
263 if (bitmap.isNull() || bitmap.getTexture()) { | 261 if (bitmap.isNull() || bitmap.getTexture()) { |
264 return; | 262 return; |
265 } | 263 } |
266 const SkBitmap* sprite = &bitmap; | 264 const SkBitmap* sprite = &bitmap; |
267 // check whether we have to handle a config8888 that doesn't match SkPMColor | 265 // check whether we have to handle a config8888 that doesn't match SkPMColor |
268 if (SkBitmap::kARGB_8888_Config == bitmap.config() && | 266 if (SkBitmap::kARGB_8888_Config == bitmap.config() && |
269 SkCanvas::kNative_Premul_Config8888 != config8888 && | 267 SkCanvas::kNative_Premul_Config8888 != config8888 && |
270 kPMColorAlias != config8888) { | 268 kPMColorAlias != config8888) { |
271 | 269 |
272 // We're going to have to convert from a config8888 to the native config | 270 // We're going to have to convert from a config8888 to the native config |
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
321 SkDraw draw; | 319 SkDraw draw; |
322 draw.fRC = &clip; | 320 draw.fRC = &clip; |
323 draw.fClip = &clip.bwRgn(); | 321 draw.fClip = &clip.bwRgn(); |
324 draw.fBitmap = &fBitmap; // canvas should have already called accessBitmap | 322 draw.fBitmap = &fBitmap; // canvas should have already called accessBitmap |
325 draw.fMatrix = &SkMatrix::I(); | 323 draw.fMatrix = &SkMatrix::I(); |
326 this->drawSprite(draw, *sprite, x, y, paint); | 324 this->drawSprite(draw, *sprite, x, y, paint); |
327 } | 325 } |
328 | 326 |
329 /////////////////////////////////////////////////////////////////////////////// | 327 /////////////////////////////////////////////////////////////////////////////// |
330 | 328 |
331 void SkDevice::drawPaint(const SkDraw& draw, const SkPaint& paint) { | 329 void SkBitmapDevice::drawPaint(const SkDraw& draw, const SkPaint& paint) { |
332 draw.drawPaint(paint); | 330 draw.drawPaint(paint); |
333 } | 331 } |
334 | 332 |
335 void SkDevice::drawPoints(const SkDraw& draw, SkCanvas::PointMode mode, size_t c
ount, | 333 void SkBitmapDevice::drawPoints(const SkDraw& draw, SkCanvas::PointMode mode, si
ze_t count, |
336 const SkPoint pts[], const SkPaint& paint) { | 334 const SkPoint pts[], const SkPaint& paint) { |
337 CHECK_FOR_NODRAW_ANNOTATION(paint); | 335 CHECK_FOR_NODRAW_ANNOTATION(paint); |
338 draw.drawPoints(mode, count, pts, paint); | 336 draw.drawPoints(mode, count, pts, paint); |
339 } | 337 } |
340 | 338 |
341 void SkDevice::drawRect(const SkDraw& draw, const SkRect& r, const SkPaint& pain
t) { | 339 void SkBitmapDevice::drawRect(const SkDraw& draw, const SkRect& r, const SkPaint
& paint) { |
342 CHECK_FOR_NODRAW_ANNOTATION(paint); | 340 CHECK_FOR_NODRAW_ANNOTATION(paint); |
343 draw.drawRect(r, paint); | 341 draw.drawRect(r, paint); |
344 } | 342 } |
345 | 343 |
346 void SkDevice::drawOval(const SkDraw& draw, const SkRect& oval, const SkPaint& p
aint) { | 344 void SkBitmapDevice::drawOval(const SkDraw& draw, const SkRect& oval, const SkPa
int& paint) { |
347 CHECK_FOR_NODRAW_ANNOTATION(paint); | 345 CHECK_FOR_NODRAW_ANNOTATION(paint); |
348 | 346 |
349 SkPath path; | 347 SkPath path; |
350 path.addOval(oval); | 348 path.addOval(oval); |
351 // call the VIRTUAL version, so any subclasses who do handle drawPath aren't | 349 // call the VIRTUAL version, so any subclasses who do handle drawPath aren't |
352 // required to override drawOval. | 350 // required to override drawOval. |
353 this->drawPath(draw, path, paint, NULL, true); | 351 this->drawPath(draw, path, paint, NULL, true); |
354 } | 352 } |
355 | 353 |
356 void SkDevice::drawRRect(const SkDraw& draw, const SkRRect& rrect, const SkPaint
& paint) { | 354 void SkBitmapDevice::drawRRect(const SkDraw& draw, const SkRRect& rrect, const S
kPaint& paint) { |
357 CHECK_FOR_NODRAW_ANNOTATION(paint); | 355 CHECK_FOR_NODRAW_ANNOTATION(paint); |
358 | 356 |
359 SkPath path; | 357 SkPath path; |
360 path.addRRect(rrect); | 358 path.addRRect(rrect); |
361 // call the VIRTUAL version, so any subclasses who do handle drawPath aren't | 359 // call the VIRTUAL version, so any subclasses who do handle drawPath aren't |
362 // required to override drawRRect. | 360 // required to override drawRRect. |
363 this->drawPath(draw, path, paint, NULL, true); | 361 this->drawPath(draw, path, paint, NULL, true); |
364 } | 362 } |
365 | 363 |
366 void SkDevice::drawPath(const SkDraw& draw, const SkPath& path, | 364 void SkBitmapDevice::drawPath(const SkDraw& draw, const SkPath& path, |
367 const SkPaint& paint, const SkMatrix* prePathMatrix, | 365 const SkPaint& paint, const SkMatrix* prePathMatri
x, |
368 bool pathIsMutable) { | 366 bool pathIsMutable) { |
369 CHECK_FOR_NODRAW_ANNOTATION(paint); | 367 CHECK_FOR_NODRAW_ANNOTATION(paint); |
370 draw.drawPath(path, paint, prePathMatrix, pathIsMutable); | 368 draw.drawPath(path, paint, prePathMatrix, pathIsMutable); |
371 } | 369 } |
372 | 370 |
373 void SkDevice::drawBitmap(const SkDraw& draw, const SkBitmap& bitmap, | 371 void SkBitmapDevice::drawBitmap(const SkDraw& draw, const SkBitmap& bitmap, |
374 const SkMatrix& matrix, const SkPaint& paint) { | 372 const SkMatrix& matrix, const SkPaint& paint) { |
375 draw.drawBitmap(bitmap, matrix, paint); | 373 draw.drawBitmap(bitmap, matrix, paint); |
376 } | 374 } |
377 | 375 |
378 void SkDevice::drawBitmapRect(const SkDraw& draw, const SkBitmap& bitmap, | 376 void SkBitmapDevice::drawBitmapRect(const SkDraw& draw, const SkBitmap& bitmap, |
379 const SkRect* src, const SkRect& dst, | 377 const SkRect* src, const SkRect& dst, |
380 const SkPaint& paint, | 378 const SkPaint& paint, |
381 SkCanvas::DrawBitmapRectFlags flags) { | 379 SkCanvas::DrawBitmapRectFlags flags) { |
382 SkMatrix matrix; | 380 SkMatrix matrix; |
383 SkRect bitmapBounds, tmpSrc, tmpDst; | 381 SkRect bitmapBounds, tmpSrc, tmpDst; |
384 SkBitmap tmpBitmap; | 382 SkBitmap tmpBitmap; |
385 | 383 |
386 bitmapBounds.isetWH(bitmap.width(), bitmap.height()); | 384 bitmapBounds.isetWH(bitmap.width(), bitmap.height()); |
387 | 385 |
388 // Compute matrix from the two rectangles | 386 // Compute matrix from the two rectangles |
389 if (src) { | 387 if (src) { |
390 tmpSrc = *src; | 388 tmpSrc = *src; |
391 } else { | 389 } else { |
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
455 | 453 |
456 SkPaint paintWithShader(paint); | 454 SkPaint paintWithShader(paint); |
457 paintWithShader.setStyle(SkPaint::kFill_Style); | 455 paintWithShader.setStyle(SkPaint::kFill_Style); |
458 paintWithShader.setShader(s)->unref(); | 456 paintWithShader.setShader(s)->unref(); |
459 | 457 |
460 // Call ourself, in case the subclass wanted to share this setup code | 458 // Call ourself, in case the subclass wanted to share this setup code |
461 // but handle the drawRect code themselves. | 459 // but handle the drawRect code themselves. |
462 this->drawRect(draw, *dstPtr, paintWithShader); | 460 this->drawRect(draw, *dstPtr, paintWithShader); |
463 } | 461 } |
464 | 462 |
465 void SkDevice::drawSprite(const SkDraw& draw, const SkBitmap& bitmap, | 463 void SkBitmapDevice::drawSprite(const SkDraw& draw, const SkBitmap& bitmap, |
466 int x, int y, const SkPaint& paint) { | 464 int x, int y, const SkPaint& paint) { |
467 draw.drawSprite(bitmap, x, y, paint); | 465 draw.drawSprite(bitmap, x, y, paint); |
468 } | 466 } |
469 | 467 |
470 void SkDevice::drawText(const SkDraw& draw, const void* text, size_t len, | 468 void SkBitmapDevice::drawText(const SkDraw& draw, const void* text, size_t len, |
471 SkScalar x, SkScalar y, const SkPaint& paint) { | 469 SkScalar x, SkScalar y, const SkPaint& paint) { |
472 draw.drawText((const char*)text, len, x, y, paint); | 470 draw.drawText((const char*)text, len, x, y, paint); |
473 } | 471 } |
474 | 472 |
475 void SkDevice::drawPosText(const SkDraw& draw, const void* text, size_t len, | 473 void SkBitmapDevice::drawPosText(const SkDraw& draw, const void* text, size_t le
n, |
476 const SkScalar xpos[], SkScalar y, | 474 const SkScalar xpos[], SkScalar y, |
477 int scalarsPerPos, const SkPaint& paint) { | 475 int scalarsPerPos, const SkPaint& paint) { |
478 draw.drawPosText((const char*)text, len, xpos, y, scalarsPerPos, paint); | 476 draw.drawPosText((const char*)text, len, xpos, y, scalarsPerPos, paint); |
479 } | 477 } |
480 | 478 |
481 void SkDevice::drawTextOnPath(const SkDraw& draw, const void* text, | 479 void SkBitmapDevice::drawTextOnPath(const SkDraw& draw, const void* text, |
482 size_t len, const SkPath& path, | 480 size_t len, const SkPath& path, |
483 const SkMatrix* matrix, | 481 const SkMatrix* matrix, |
484 const SkPaint& paint) { | 482 const SkPaint& paint) { |
485 draw.drawTextOnPath((const char*)text, len, path, matrix, paint); | 483 draw.drawTextOnPath((const char*)text, len, path, matrix, paint); |
486 } | 484 } |
487 | 485 |
488 #ifdef SK_BUILD_FOR_ANDROID | 486 #ifdef SK_BUILD_FOR_ANDROID |
489 void SkDevice::drawPosTextOnPath(const SkDraw& draw, const void* text, size_t le
n, | 487 void SkBitmapDevice::drawPosTextOnPath(const SkDraw& draw, const void* text, siz
e_t len, |
490 const SkPoint pos[], const SkPaint& paint, | 488 const SkPoint pos[], const SkPaint& paint
, |
491 const SkPath& path, const SkMatrix* matrix)
{ | 489 const SkPath& path, const SkMatrix* matri
x) { |
492 draw.drawPosTextOnPath((const char*)text, len, pos, paint, path, matrix); | 490 draw.drawPosTextOnPath((const char*)text, len, pos, paint, path, matrix); |
493 } | 491 } |
494 #endif | 492 #endif |
495 | 493 |
496 void SkDevice::drawVertices(const SkDraw& draw, SkCanvas::VertexMode vmode, | 494 void SkBitmapDevice::drawVertices(const SkDraw& draw, SkCanvas::VertexMode vmode
, |
497 int vertexCount, | 495 int vertexCount, |
498 const SkPoint verts[], const SkPoint textures[], | 496 const SkPoint verts[], const SkPoint textures[
], |
499 const SkColor colors[], SkXfermode* xmode, | 497 const SkColor colors[], SkXfermode* xmode, |
500 const uint16_t indices[], int indexCount, | 498 const uint16_t indices[], int indexCount, |
501 const SkPaint& paint) { | 499 const SkPaint& paint) { |
502 draw.drawVertices(vmode, vertexCount, verts, textures, colors, xmode, | 500 draw.drawVertices(vmode, vertexCount, verts, textures, colors, xmode, |
503 indices, indexCount, paint); | 501 indices, indexCount, paint); |
504 } | 502 } |
505 | 503 |
506 void SkDevice::drawDevice(const SkDraw& draw, SkDevice* device, | 504 void SkBitmapDevice::drawDevice(const SkDraw& draw, SkBaseDevice* device, |
507 int x, int y, const SkPaint& paint) { | 505 int x, int y, const SkPaint& paint) { |
508 const SkBitmap& src = device->accessBitmap(false); | 506 const SkBitmap& src = device->accessBitmap(false); |
509 draw.drawSprite(src, x, y, paint); | 507 draw.drawSprite(src, x, y, paint); |
510 } | 508 } |
511 | 509 |
512 /////////////////////////////////////////////////////////////////////////////// | 510 /////////////////////////////////////////////////////////////////////////////// |
513 | 511 |
514 bool SkDevice::filterTextFlags(const SkPaint& paint, TextFlags* flags) { | 512 bool SkBitmapDevice::filterTextFlags(const SkPaint& paint, TextFlags* flags) { |
515 if (!paint.isLCDRenderText() || !paint.isAntiAlias()) { | 513 if (!paint.isLCDRenderText() || !paint.isAntiAlias()) { |
516 // we're cool with the paint as is | 514 // we're cool with the paint as is |
517 return false; | 515 return false; |
518 } | 516 } |
519 | 517 |
520 if (SkBitmap::kARGB_8888_Config != fBitmap.config() || | 518 if (SkBitmap::kARGB_8888_Config != fBitmap.config() || |
521 paint.getRasterizer() || | 519 paint.getRasterizer() || |
522 paint.getPathEffect() || | 520 paint.getPathEffect() || |
523 paint.isFakeBoldText() || | 521 paint.isFakeBoldText() || |
524 paint.getStyle() != SkPaint::kFill_Style || | 522 paint.getStyle() != SkPaint::kFill_Style || |
525 !SkXfermode::IsMode(paint.getXfermode(), SkXfermode::kSrcOver_Mode)) { | 523 !SkXfermode::IsMode(paint.getXfermode(), SkXfermode::kSrcOver_Mode)) { |
526 // turn off lcd | 524 // turn off lcd |
527 flags->fFlags = paint.getFlags() & ~SkPaint::kLCDRenderText_Flag; | 525 flags->fFlags = paint.getFlags() & ~SkPaint::kLCDRenderText_Flag; |
528 flags->fHinting = paint.getHinting(); | 526 flags->fHinting = paint.getHinting(); |
529 return true; | 527 return true; |
530 } | 528 } |
531 // we're cool with the paint as is | 529 // we're cool with the paint as is |
532 return false; | 530 return false; |
533 } | 531 } |
OLD | NEW |