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(SkDevice) |
| 19 SK_DEFINE_INST_COUNT(SkRasterDevice) |
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 SkRasterDevice::SkRasterDevice(const SkBitmap& bitmap) |
28 : fBitmap(bitmap), fLeakyProperties(SkDeviceProperties::MakeDefault()) | 29 : fBitmap(bitmap) { |
| 30 SkASSERT(SkBitmap::kARGB_4444_Config != bitmap.config()); |
| 31 } |
| 32 |
| 33 SkDevice::SkDevice() |
| 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 SkRasterDevice::SkRasterDevice(const SkBitmap& bitmap, const SkDeviceProperties&
deviceProperties) |
50 : fLeakyProperties(SkDeviceProperties::MakeDefault()) | 44 : SkDevice(deviceProperties) |
| 45 , fBitmap(bitmap) { |
| 46 } |
| 47 |
| 48 SkDevice::SkDevice(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 SkRasterDevice::SkRasterDevice(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 SkRasterDevice::SkRasterDevice(SkBitmap::Config config, int width, int height, b
ool isOpaque, |
67 const SkDeviceProperties& deviceProperties) | 68 const SkDeviceProperties& deviceProperties) |
68 : fLeakyProperties(deviceProperties) | 69 : SkDevice(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 SkDevice::~SkDevice() { |
85 delete fMetaData; | 80 delete fMetaData; |
86 } | 81 } |
87 | 82 |
88 void SkDevice::replaceBitmapBackendForRasterSurface(const SkBitmap& bm) { | 83 SkRasterDevice::~SkRasterDevice() { |
| 84 } |
| 85 |
| 86 void SkRasterDevice::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 SkDevice* SkDevice::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 SkDevice* SkDevice::createCompatibleDeviceForSaveLayer(SkBitmap::Config config, |
103 int width, int height, | 101 int width, int height, |
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 SkDevice* SkRasterDevice::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(SkRasterDevice,(config, width, height, isOpaque, this->get
DeviceProperties())); |
114 } | 112 } |
115 | 113 |
116 SkMetaData& SkDevice::getMetaData() { | 114 SkMetaData& SkDevice::getMetaData() { |
117 // metadata users are rare, so we lazily allocate it. If that changes we | 115 // 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) | 116 // can decide to just make it a field in the device (rather than a ptr) |
119 if (NULL == fMetaData) { | 117 if (NULL == fMetaData) { |
120 fMetaData = new SkMetaData; | 118 fMetaData = new SkMetaData; |
121 } | 119 } |
122 return *fMetaData; | 120 return *fMetaData; |
123 } | 121 } |
124 | 122 |
125 void SkDevice::lockPixels() { | 123 void SkRasterDevice::lockPixels() { |
126 if (fBitmap.lockPixelsAreWritable()) { | 124 if (fBitmap.lockPixelsAreWritable()) { |
127 fBitmap.lockPixels(); | 125 fBitmap.lockPixels(); |
128 } | 126 } |
129 } | 127 } |
130 | 128 |
131 void SkDevice::unlockPixels() { | 129 void SkRasterDevice::unlockPixels() { |
132 if (fBitmap.lockPixelsAreWritable()) { | 130 if (fBitmap.lockPixelsAreWritable()) { |
133 fBitmap.unlockPixels(); | 131 fBitmap.unlockPixels(); |
134 } | 132 } |
135 } | 133 } |
136 | 134 |
137 const SkBitmap& SkDevice::accessBitmap(bool changePixels) { | 135 const SkBitmap& SkDevice::accessBitmap(bool changePixels) { |
138 const SkBitmap& bitmap = this->onAccessBitmap(&fBitmap); | 136 const SkBitmap& bitmap = this->onAccessBitmap(); |
139 if (changePixels) { | 137 if (changePixels) { |
140 bitmap.notifyPixelsChanged(); | 138 bitmap.notifyPixelsChanged(); |
141 } | 139 } |
142 return bitmap; | 140 return bitmap; |
143 } | 141 } |
144 | 142 |
145 void SkDevice::getGlobalBounds(SkIRect* bounds) const { | 143 void SkRasterDevice::getGlobalBounds(SkIRect* bounds) const { |
146 if (bounds) { | 144 if (bounds) { |
147 bounds->setXYWH(fOrigin.x(), fOrigin.y(), | 145 const SkIPoint& origin = this->getOrigin(); |
| 146 bounds->setXYWH(origin.x(), origin.y(), |
148 fBitmap.width(), fBitmap.height()); | 147 fBitmap.width(), fBitmap.height()); |
149 } | 148 } |
150 } | 149 } |
151 | 150 |
152 void SkDevice::clear(SkColor color) { | 151 void SkRasterDevice::clear(SkColor color) { |
153 fBitmap.eraseColor(color); | 152 fBitmap.eraseColor(color); |
154 } | 153 } |
155 | 154 |
156 const SkBitmap& SkDevice::onAccessBitmap(SkBitmap* bitmap) {return *bitmap;} | 155 const SkBitmap& SkRasterDevice::onAccessBitmap() { |
157 | 156 return fBitmap; |
158 void SkDevice::setMatrixClip(const SkMatrix& matrix, const SkRegion& region, | |
159 const SkClipStack& clipStack) { | |
160 } | 157 } |
161 | 158 |
162 bool SkDevice::canHandleImageFilter(SkImageFilter*) { | 159 bool SkRasterDevice::canHandleImageFilter(SkImageFilter*) { |
163 return false; | 160 return false; |
164 } | 161 } |
165 | 162 |
166 bool SkDevice::filterImage(SkImageFilter* filter, const SkBitmap& src, | 163 bool SkRasterDevice::filterImage(SkImageFilter* filter, const SkBitmap& src, |
167 const SkMatrix& ctm, SkBitmap* result, | 164 const SkMatrix& ctm, SkBitmap* result, |
168 SkIPoint* offset) { | 165 SkIPoint* offset) { |
169 return false; | 166 return false; |
170 } | 167 } |
171 | 168 |
172 bool SkDevice::allowImageFilter(SkImageFilter*) { | 169 bool SkRasterDevice::allowImageFilter(SkImageFilter*) { |
173 return true; | 170 return true; |
174 } | 171 } |
175 | 172 |
176 /////////////////////////////////////////////////////////////////////////////// | 173 /////////////////////////////////////////////////////////////////////////////// |
177 | 174 |
178 bool SkDevice::readPixels(SkBitmap* bitmap, int x, int y, | 175 bool SkDevice::readPixels(SkBitmap* bitmap, int x, int y, |
179 SkCanvas::Config8888 config8888) { | 176 SkCanvas::Config8888 config8888) { |
180 if (SkBitmap::kARGB_8888_Config != bitmap->config() || | 177 if (SkBitmap::kARGB_8888_Config != bitmap->config() || |
181 NULL != bitmap->getTexture()) { | 178 NULL != bitmap->getTexture()) { |
182 return false; | 179 return false; |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
225 #elif SK_PMCOLOR_BYTE_ORDER(R,G,B,A) | 222 #elif SK_PMCOLOR_BYTE_ORDER(R,G,B,A) |
226 const SkCanvas::Config8888 SkDevice::kPMColorAlias = | 223 const SkCanvas::Config8888 SkDevice::kPMColorAlias = |
227 SkCanvas::kRGBA_Premul_Config8888; | 224 SkCanvas::kRGBA_Premul_Config8888; |
228 #else | 225 #else |
229 const SkCanvas::Config8888 SkDevice::kPMColorAlias = | 226 const SkCanvas::Config8888 SkDevice::kPMColorAlias = |
230 (SkCanvas::Config8888) -1; | 227 (SkCanvas::Config8888) -1; |
231 #endif | 228 #endif |
232 | 229 |
233 #include <SkConfig8888.h> | 230 #include <SkConfig8888.h> |
234 | 231 |
235 bool SkDevice::onReadPixels(const SkBitmap& bitmap, | 232 bool SkRasterDevice::onReadPixels(const SkBitmap& bitmap, |
236 int x, int y, | 233 int x, int y, |
237 SkCanvas::Config8888 config8888) { | 234 SkCanvas::Config8888 config8888) { |
238 SkASSERT(SkBitmap::kARGB_8888_Config == bitmap.config()); | 235 SkASSERT(SkBitmap::kARGB_8888_Config == bitmap.config()); |
239 SkASSERT(!bitmap.isNull()); | 236 SkASSERT(!bitmap.isNull()); |
240 SkASSERT(SkIRect::MakeWH(this->width(), this->height()).contains(SkIRect::Ma
keXYWH(x, y, bitmap.width(), bitmap.height()))); | 237 SkASSERT(SkIRect::MakeWH(this->width(), this->height()).contains(SkIRect::Ma
keXYWH(x, y, bitmap.width(), bitmap.height()))); |
241 | 238 |
242 SkIRect srcRect = SkIRect::MakeXYWH(x, y, bitmap.width(), | 239 SkIRect srcRect = SkIRect::MakeXYWH(x, y, bitmap.width(), |
243 bitmap.height()); | 240 bitmap.height()); |
244 const SkBitmap& src = this->accessBitmap(false); | 241 const SkBitmap& src = this->accessBitmap(false); |
245 | 242 |
246 SkBitmap subset; | 243 SkBitmap subset; |
247 if (!src.extractSubset(&subset, srcRect)) { | 244 if (!src.extractSubset(&subset, srcRect)) { |
248 return false; | 245 return false; |
249 } | 246 } |
250 if (SkBitmap::kARGB_8888_Config != subset.config()) { | 247 if (SkBitmap::kARGB_8888_Config != subset.config()) { |
251 // It'd be preferable to do this directly to bitmap. | 248 // It'd be preferable to do this directly to bitmap. |
252 subset.copyTo(&subset, SkBitmap::kARGB_8888_Config); | 249 subset.copyTo(&subset, SkBitmap::kARGB_8888_Config); |
253 } | 250 } |
254 SkAutoLockPixels alp(bitmap); | 251 SkAutoLockPixels alp(bitmap); |
255 uint32_t* bmpPixels = reinterpret_cast<uint32_t*>(bitmap.getPixels()); | 252 uint32_t* bmpPixels = reinterpret_cast<uint32_t*>(bitmap.getPixels()); |
256 SkCopyBitmapToConfig8888(bmpPixels, bitmap.rowBytes(), config8888, subset); | 253 SkCopyBitmapToConfig8888(bmpPixels, bitmap.rowBytes(), config8888, subset); |
257 return true; | 254 return true; |
258 } | 255 } |
259 | 256 |
260 void SkDevice::writePixels(const SkBitmap& bitmap, | 257 void SkRasterDevice::writePixels(const SkBitmap& bitmap, |
261 int x, int y, | 258 int x, int y, |
262 SkCanvas::Config8888 config8888) { | 259 SkCanvas::Config8888 config8888) { |
263 if (bitmap.isNull() || bitmap.getTexture()) { | 260 if (bitmap.isNull() || bitmap.getTexture()) { |
264 return; | 261 return; |
265 } | 262 } |
266 const SkBitmap* sprite = &bitmap; | 263 const SkBitmap* sprite = &bitmap; |
267 // check whether we have to handle a config8888 that doesn't match SkPMColor | 264 // check whether we have to handle a config8888 that doesn't match SkPMColor |
268 if (SkBitmap::kARGB_8888_Config == bitmap.config() && | 265 if (SkBitmap::kARGB_8888_Config == bitmap.config() && |
269 SkCanvas::kNative_Premul_Config8888 != config8888 && | 266 SkCanvas::kNative_Premul_Config8888 != config8888 && |
270 kPMColorAlias != config8888) { | 267 kPMColorAlias != config8888) { |
271 | 268 |
272 // We're going to have to convert from a config8888 to the native config | 269 // 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; | 318 SkDraw draw; |
322 draw.fRC = &clip; | 319 draw.fRC = &clip; |
323 draw.fClip = &clip.bwRgn(); | 320 draw.fClip = &clip.bwRgn(); |
324 draw.fBitmap = &fBitmap; // canvas should have already called accessBitmap | 321 draw.fBitmap = &fBitmap; // canvas should have already called accessBitmap |
325 draw.fMatrix = &SkMatrix::I(); | 322 draw.fMatrix = &SkMatrix::I(); |
326 this->drawSprite(draw, *sprite, x, y, paint); | 323 this->drawSprite(draw, *sprite, x, y, paint); |
327 } | 324 } |
328 | 325 |
329 /////////////////////////////////////////////////////////////////////////////// | 326 /////////////////////////////////////////////////////////////////////////////// |
330 | 327 |
331 void SkDevice::drawPaint(const SkDraw& draw, const SkPaint& paint) { | 328 void SkRasterDevice::drawPaint(const SkDraw& draw, const SkPaint& paint) { |
332 draw.drawPaint(paint); | 329 draw.drawPaint(paint); |
333 } | 330 } |
334 | 331 |
335 void SkDevice::drawPoints(const SkDraw& draw, SkCanvas::PointMode mode, size_t c
ount, | 332 void SkRasterDevice::drawPoints(const SkDraw& draw, SkCanvas::PointMode mode, si
ze_t count, |
336 const SkPoint pts[], const SkPaint& paint) { | 333 const SkPoint pts[], const SkPaint& paint) { |
337 CHECK_FOR_NODRAW_ANNOTATION(paint); | 334 CHECK_FOR_NODRAW_ANNOTATION(paint); |
338 draw.drawPoints(mode, count, pts, paint); | 335 draw.drawPoints(mode, count, pts, paint); |
339 } | 336 } |
340 | 337 |
341 void SkDevice::drawRect(const SkDraw& draw, const SkRect& r, const SkPaint& pain
t) { | 338 void SkRasterDevice::drawRect(const SkDraw& draw, const SkRect& r, const SkPaint
& paint) { |
342 CHECK_FOR_NODRAW_ANNOTATION(paint); | 339 CHECK_FOR_NODRAW_ANNOTATION(paint); |
343 draw.drawRect(r, paint); | 340 draw.drawRect(r, paint); |
344 } | 341 } |
345 | 342 |
346 void SkDevice::drawOval(const SkDraw& draw, const SkRect& oval, const SkPaint& p
aint) { | 343 void SkRasterDevice::drawOval(const SkDraw& draw, const SkRect& oval, const SkPa
int& paint) { |
347 CHECK_FOR_NODRAW_ANNOTATION(paint); | 344 CHECK_FOR_NODRAW_ANNOTATION(paint); |
348 | 345 |
349 SkPath path; | 346 SkPath path; |
350 path.addOval(oval); | 347 path.addOval(oval); |
351 // call the VIRTUAL version, so any subclasses who do handle drawPath aren't | 348 // call the VIRTUAL version, so any subclasses who do handle drawPath aren't |
352 // required to override drawOval. | 349 // required to override drawOval. |
353 this->drawPath(draw, path, paint, NULL, true); | 350 this->drawPath(draw, path, paint, NULL, true); |
354 } | 351 } |
355 | 352 |
356 void SkDevice::drawRRect(const SkDraw& draw, const SkRRect& rrect, const SkPaint
& paint) { | 353 void SkRasterDevice::drawRRect(const SkDraw& draw, const SkRRect& rrect, const S
kPaint& paint) { |
357 CHECK_FOR_NODRAW_ANNOTATION(paint); | 354 CHECK_FOR_NODRAW_ANNOTATION(paint); |
358 | 355 |
359 SkPath path; | 356 SkPath path; |
360 path.addRRect(rrect); | 357 path.addRRect(rrect); |
361 // call the VIRTUAL version, so any subclasses who do handle drawPath aren't | 358 // call the VIRTUAL version, so any subclasses who do handle drawPath aren't |
362 // required to override drawRRect. | 359 // required to override drawRRect. |
363 this->drawPath(draw, path, paint, NULL, true); | 360 this->drawPath(draw, path, paint, NULL, true); |
364 } | 361 } |
365 | 362 |
366 void SkDevice::drawPath(const SkDraw& draw, const SkPath& path, | 363 void SkRasterDevice::drawPath(const SkDraw& draw, const SkPath& path, |
367 const SkPaint& paint, const SkMatrix* prePathMatrix, | 364 const SkPaint& paint, const SkMatrix* prePathMatri
x, |
368 bool pathIsMutable) { | 365 bool pathIsMutable) { |
369 CHECK_FOR_NODRAW_ANNOTATION(paint); | 366 CHECK_FOR_NODRAW_ANNOTATION(paint); |
370 draw.drawPath(path, paint, prePathMatrix, pathIsMutable); | 367 draw.drawPath(path, paint, prePathMatrix, pathIsMutable); |
371 } | 368 } |
372 | 369 |
373 void SkDevice::drawBitmap(const SkDraw& draw, const SkBitmap& bitmap, | 370 void SkRasterDevice::drawBitmap(const SkDraw& draw, const SkBitmap& bitmap, |
374 const SkMatrix& matrix, const SkPaint& paint) { | 371 const SkMatrix& matrix, const SkPaint& paint) { |
375 draw.drawBitmap(bitmap, matrix, paint); | 372 draw.drawBitmap(bitmap, matrix, paint); |
376 } | 373 } |
377 | 374 |
378 void SkDevice::drawBitmapRect(const SkDraw& draw, const SkBitmap& bitmap, | 375 void SkRasterDevice::drawBitmapRect(const SkDraw& draw, const SkBitmap& bitmap, |
379 const SkRect* src, const SkRect& dst, | 376 const SkRect* src, const SkRect& dst, |
380 const SkPaint& paint) { | 377 const SkPaint& paint) { |
381 SkMatrix matrix; | 378 SkMatrix matrix; |
382 SkRect bitmapBounds, tmpSrc, tmpDst; | 379 SkRect bitmapBounds, tmpSrc, tmpDst; |
383 SkBitmap tmpBitmap; | 380 SkBitmap tmpBitmap; |
384 | 381 |
385 bitmapBounds.isetWH(bitmap.width(), bitmap.height()); | 382 bitmapBounds.isetWH(bitmap.width(), bitmap.height()); |
386 | 383 |
387 // Compute matrix from the two rectangles | 384 // Compute matrix from the two rectangles |
388 if (src) { | 385 if (src) { |
389 tmpSrc = *src; | 386 tmpSrc = *src; |
390 } else { | 387 } else { |
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
454 | 451 |
455 SkPaint paintWithShader(paint); | 452 SkPaint paintWithShader(paint); |
456 paintWithShader.setStyle(SkPaint::kFill_Style); | 453 paintWithShader.setStyle(SkPaint::kFill_Style); |
457 paintWithShader.setShader(s)->unref(); | 454 paintWithShader.setShader(s)->unref(); |
458 | 455 |
459 // Call ourself, in case the subclass wanted to share this setup code | 456 // Call ourself, in case the subclass wanted to share this setup code |
460 // but handle the drawRect code themselves. | 457 // but handle the drawRect code themselves. |
461 this->drawRect(draw, *dstPtr, paintWithShader); | 458 this->drawRect(draw, *dstPtr, paintWithShader); |
462 } | 459 } |
463 | 460 |
464 void SkDevice::drawSprite(const SkDraw& draw, const SkBitmap& bitmap, | 461 void SkRasterDevice::drawSprite(const SkDraw& draw, const SkBitmap& bitmap, |
465 int x, int y, const SkPaint& paint) { | 462 int x, int y, const SkPaint& paint) { |
466 draw.drawSprite(bitmap, x, y, paint); | 463 draw.drawSprite(bitmap, x, y, paint); |
467 } | 464 } |
468 | 465 |
469 void SkDevice::drawText(const SkDraw& draw, const void* text, size_t len, | 466 void SkRasterDevice::drawText(const SkDraw& draw, const void* text, size_t len, |
470 SkScalar x, SkScalar y, const SkPaint& paint) { | 467 SkScalar x, SkScalar y, const SkPaint& paint) { |
471 draw.drawText((const char*)text, len, x, y, paint); | 468 draw.drawText((const char*)text, len, x, y, paint); |
472 } | 469 } |
473 | 470 |
474 void SkDevice::drawPosText(const SkDraw& draw, const void* text, size_t len, | 471 void SkRasterDevice::drawPosText(const SkDraw& draw, const void* text, size_t le
n, |
475 const SkScalar xpos[], SkScalar y, | 472 const SkScalar xpos[], SkScalar y, |
476 int scalarsPerPos, const SkPaint& paint) { | 473 int scalarsPerPos, const SkPaint& paint) { |
477 draw.drawPosText((const char*)text, len, xpos, y, scalarsPerPos, paint); | 474 draw.drawPosText((const char*)text, len, xpos, y, scalarsPerPos, paint); |
478 } | 475 } |
479 | 476 |
480 void SkDevice::drawTextOnPath(const SkDraw& draw, const void* text, | 477 void SkRasterDevice::drawTextOnPath(const SkDraw& draw, const void* text, |
481 size_t len, const SkPath& path, | 478 size_t len, const SkPath& path, |
482 const SkMatrix* matrix, | 479 const SkMatrix* matrix, |
483 const SkPaint& paint) { | 480 const SkPaint& paint) { |
484 draw.drawTextOnPath((const char*)text, len, path, matrix, paint); | 481 draw.drawTextOnPath((const char*)text, len, path, matrix, paint); |
485 } | 482 } |
486 | 483 |
487 #ifdef SK_BUILD_FOR_ANDROID | 484 #ifdef SK_BUILD_FOR_ANDROID |
488 void SkDevice::drawPosTextOnPath(const SkDraw& draw, const void* text, size_t le
n, | 485 void SkRasterDevice::drawPosTextOnPath(const SkDraw& draw, const void* text, siz
e_t len, |
489 const SkPoint pos[], const SkPaint& paint, | 486 const SkPoint pos[], const SkPaint& paint
, |
490 const SkPath& path, const SkMatrix* matrix)
{ | 487 const SkPath& path, const SkMatrix* matri
x) { |
491 draw.drawPosTextOnPath((const char*)text, len, pos, paint, path, matrix); | 488 draw.drawPosTextOnPath((const char*)text, len, pos, paint, path, matrix); |
492 } | 489 } |
493 #endif | 490 #endif |
494 | 491 |
495 void SkDevice::drawVertices(const SkDraw& draw, SkCanvas::VertexMode vmode, | 492 void SkRasterDevice::drawVertices(const SkDraw& draw, SkCanvas::VertexMode vmode
, |
496 int vertexCount, | 493 int vertexCount, |
497 const SkPoint verts[], const SkPoint textures[], | 494 const SkPoint verts[], const SkPoint textures[
], |
498 const SkColor colors[], SkXfermode* xmode, | 495 const SkColor colors[], SkXfermode* xmode, |
499 const uint16_t indices[], int indexCount, | 496 const uint16_t indices[], int indexCount, |
500 const SkPaint& paint) { | 497 const SkPaint& paint) { |
501 draw.drawVertices(vmode, vertexCount, verts, textures, colors, xmode, | 498 draw.drawVertices(vmode, vertexCount, verts, textures, colors, xmode, |
502 indices, indexCount, paint); | 499 indices, indexCount, paint); |
503 } | 500 } |
504 | 501 |
505 void SkDevice::drawDevice(const SkDraw& draw, SkDevice* device, | 502 void SkRasterDevice::drawDevice(const SkDraw& draw, SkDevice* device, |
506 int x, int y, const SkPaint& paint) { | 503 int x, int y, const SkPaint& paint) { |
507 const SkBitmap& src = device->accessBitmap(false); | 504 const SkBitmap& src = device->accessBitmap(false); |
508 draw.drawSprite(src, x, y, paint); | 505 draw.drawSprite(src, x, y, paint); |
509 } | 506 } |
510 | 507 |
511 /////////////////////////////////////////////////////////////////////////////// | 508 /////////////////////////////////////////////////////////////////////////////// |
512 | 509 |
513 bool SkDevice::filterTextFlags(const SkPaint& paint, TextFlags* flags) { | 510 bool SkRasterDevice::filterTextFlags(const SkPaint& paint, TextFlags* flags) { |
514 if (!paint.isLCDRenderText() || !paint.isAntiAlias()) { | 511 if (!paint.isLCDRenderText() || !paint.isAntiAlias()) { |
515 // we're cool with the paint as is | 512 // we're cool with the paint as is |
516 return false; | 513 return false; |
517 } | 514 } |
518 | 515 |
519 if (SkBitmap::kARGB_8888_Config != fBitmap.config() || | 516 if (SkBitmap::kARGB_8888_Config != fBitmap.config() || |
520 paint.getRasterizer() || | 517 paint.getRasterizer() || |
521 paint.getPathEffect() || | 518 paint.getPathEffect() || |
522 paint.isFakeBoldText() || | 519 paint.isFakeBoldText() || |
523 paint.getStyle() != SkPaint::kFill_Style || | 520 paint.getStyle() != SkPaint::kFill_Style || |
524 !SkXfermode::IsMode(paint.getXfermode(), SkXfermode::kSrcOver_Mode)) { | 521 !SkXfermode::IsMode(paint.getXfermode(), SkXfermode::kSrcOver_Mode)) { |
525 // turn off lcd | 522 // turn off lcd |
526 flags->fFlags = paint.getFlags() & ~SkPaint::kLCDRenderText_Flag; | 523 flags->fFlags = paint.getFlags() & ~SkPaint::kLCDRenderText_Flag; |
527 flags->fHinting = paint.getHinting(); | 524 flags->fHinting = paint.getHinting(); |
528 return true; | 525 return true; |
529 } | 526 } |
530 // we're cool with the paint as is | 527 // we're cool with the paint as is |
531 return false; | 528 return false; |
532 } | 529 } |
OLD | NEW |