Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1005)

Side by Side Diff: src/core/SkDevice.cpp

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

Powered by Google App Engine
This is Rietveld 408576698