| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright 2013 Google Inc. | 2 * Copyright 2013 Google Inc. |
| 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 #include "SkBitmapDevice.h" | 8 #include "SkBitmapDevice.h" |
| 9 #include "SkConfig8888.h" | 9 #include "SkConfig8888.h" |
| 10 #include "SkDraw.h" | 10 #include "SkDraw.h" |
| (...skipping 155 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 166 bool SkBitmapDevice::filterImage(const SkImageFilter* filter, const SkBitmap& sr
c, | 166 bool SkBitmapDevice::filterImage(const SkImageFilter* filter, const SkBitmap& sr
c, |
| 167 const SkImageFilter::Context& ctx, SkBitmap* re
sult, | 167 const SkImageFilter::Context& ctx, SkBitmap* re
sult, |
| 168 SkIPoint* offset) { | 168 SkIPoint* offset) { |
| 169 return false; | 169 return false; |
| 170 } | 170 } |
| 171 | 171 |
| 172 bool SkBitmapDevice::allowImageFilter(const SkImageFilter*) { | 172 bool SkBitmapDevice::allowImageFilter(const SkImageFilter*) { |
| 173 return true; | 173 return true; |
| 174 } | 174 } |
| 175 | 175 |
| 176 #ifdef SK_SUPPORT_LEGACY_READPIXELSCONFIG |
| 176 bool SkBitmapDevice::onReadPixels(const SkBitmap& bitmap, | 177 bool SkBitmapDevice::onReadPixels(const SkBitmap& bitmap, |
| 177 int x, int y, | 178 int x, int y, |
| 178 SkCanvas::Config8888 config8888) { | 179 SkCanvas::Config8888 config8888) { |
| 179 SkASSERT(SkBitmap::kARGB_8888_Config == bitmap.config()); | 180 SkASSERT(SkBitmap::kARGB_8888_Config == bitmap.config()); |
| 180 SkASSERT(!bitmap.isNull()); | 181 SkASSERT(!bitmap.isNull()); |
| 181 SkASSERT(SkIRect::MakeWH(this->width(), this->height()).contains(SkIRect::Ma
keXYWH(x, y, | 182 SkASSERT(SkIRect::MakeWH(this->width(), this->height()).contains(SkIRect::Ma
keXYWH(x, y, |
| 182 bitmap
.width(), | 183 bitmap
.width(), |
| 183 bitmap
.height()))); | 184 bitmap
.height()))); |
| 184 | 185 |
| 185 SkIRect srcRect = SkIRect::MakeXYWH(x, y, bitmap.width(), bitmap.height()); | 186 SkIRect srcRect = SkIRect::MakeXYWH(x, y, bitmap.width(), bitmap.height()); |
| 186 const SkBitmap& src = this->accessBitmap(false); | 187 const SkBitmap& src = this->accessBitmap(false); |
| 187 | 188 |
| 188 SkBitmap subset; | 189 SkBitmap subset; |
| 189 if (!src.extractSubset(&subset, srcRect)) { | 190 if (!src.extractSubset(&subset, srcRect)) { |
| 190 return false; | 191 return false; |
| 191 } | 192 } |
| 192 if (kPMColor_SkColorType != subset.colorType()) { | 193 if (kPMColor_SkColorType != subset.colorType()) { |
| 193 // It'd be preferable to do this directly to bitmap. | 194 // It'd be preferable to do this directly to bitmap. |
| 194 subset.copyTo(&subset, kPMColor_SkColorType); | 195 subset.copyTo(&subset, kPMColor_SkColorType); |
| 195 } | 196 } |
| 196 SkAutoLockPixels alp(bitmap); | 197 SkAutoLockPixels alp(bitmap); |
| 197 uint32_t* bmpPixels = reinterpret_cast<uint32_t*>(bitmap.getPixels()); | 198 uint32_t* bmpPixels = reinterpret_cast<uint32_t*>(bitmap.getPixels()); |
| 198 SkCopyBitmapToConfig8888(bmpPixels, bitmap.rowBytes(), config8888, subset); | 199 SkCopyBitmapToConfig8888(bmpPixels, bitmap.rowBytes(), config8888, subset); |
| 199 return true; | 200 return true; |
| 200 } | 201 } |
| 202 #endif |
| 201 | 203 |
| 202 #ifdef SK_SUPPORT_LEGACY_WRITEPIXELSCONFIG | 204 #ifdef SK_SUPPORT_LEGACY_WRITEPIXELSCONFIG |
| 203 void SkBitmapDevice::writePixels(const SkBitmap& bitmap, | 205 void SkBitmapDevice::writePixels(const SkBitmap& bitmap, |
| 204 int x, int y, | 206 int x, int y, |
| 205 SkCanvas::Config8888 config8888) { | 207 SkCanvas::Config8888 config8888) { |
| 206 if (bitmap.isNull() || bitmap.getTexture()) { | 208 if (bitmap.isNull() || bitmap.getTexture()) { |
| 207 return; | 209 return; |
| 208 } | 210 } |
| 209 const SkBitmap* sprite = &bitmap; | 211 const SkBitmap* sprite = &bitmap; |
| 210 // check whether we have to handle a config8888 that doesn't match SkPMColor | 212 // check whether we have to handle a config8888 that doesn't match SkPMColor |
| (...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 308 case kBGRA_8888_SkColorType: | 310 case kBGRA_8888_SkColorType: |
| 309 *config = pre ? SkCanvas::kBGRA_Premul_Config8888 : SkCanvas::kBGRA_
Unpremul_Config8888; | 311 *config = pre ? SkCanvas::kBGRA_Premul_Config8888 : SkCanvas::kBGRA_
Unpremul_Config8888; |
| 310 return true; | 312 return true; |
| 311 default: | 313 default: |
| 312 return false; | 314 return false; |
| 313 } | 315 } |
| 314 } | 316 } |
| 315 | 317 |
| 316 // TODO: make this guy real, and not rely on legacy config8888 utility | 318 // TODO: make this guy real, and not rely on legacy config8888 utility |
| 317 #include "SkConfig8888.h" | 319 #include "SkConfig8888.h" |
| 318 static bool write_pixels(const SkImageInfo& dstInfo, void* dstPixels, size_t dst
RowBytes, | 320 static bool copy_pixels(const SkImageInfo& dstInfo, void* dstPixels, size_t dstR
owBytes, |
| 319 const SkImageInfo& srcInfo, const void* srcPixels, size
_t srcRowBytes) { | 321 const SkImageInfo& srcInfo, const void* srcPixels, size_
t srcRowBytes) { |
| 320 if (srcInfo.dimensions() != dstInfo.dimensions()) { | 322 if (srcInfo.dimensions() != dstInfo.dimensions()) { |
| 321 return false; | 323 return false; |
| 322 } | 324 } |
| 323 if (4 == srcInfo.bytesPerPixel() && 4 == dstInfo.bytesPerPixel()) { | 325 if (4 == srcInfo.bytesPerPixel() && 4 == dstInfo.bytesPerPixel()) { |
| 324 SkCanvas::Config8888 srcConfig, dstConfig; | 326 SkCanvas::Config8888 srcConfig, dstConfig; |
| 325 if (!info2config8888(srcInfo, &srcConfig) || !info2config8888(dstInfo, &
dstConfig)) { | 327 if (!info2config8888(srcInfo, &srcConfig) || !info2config8888(dstInfo, &
dstConfig)) { |
| 326 return false; | 328 return false; |
| 327 } | 329 } |
| 328 SkConvertConfig8888Pixels((uint32_t*)dstPixels, dstRowBytes, dstConfig, | 330 SkConvertConfig8888Pixels((uint32_t*)dstPixels, dstRowBytes, dstConfig, |
| 329 (const uint32_t*)srcPixels, srcRowBytes, srcCo
nfig, | 331 (const uint32_t*)srcPixels, srcRowBytes, srcCo
nfig, |
| (...skipping 27 matching lines...) Expand all Loading... |
| 357 return false; | 359 return false; |
| 358 } | 360 } |
| 359 | 361 |
| 360 SkImageInfo dstInfo = fBitmap.info(); | 362 SkImageInfo dstInfo = fBitmap.info(); |
| 361 dstInfo.fWidth = srcInfo.width(); | 363 dstInfo.fWidth = srcInfo.width(); |
| 362 dstInfo.fHeight = srcInfo.height(); | 364 dstInfo.fHeight = srcInfo.height(); |
| 363 | 365 |
| 364 void* dstPixels = fBitmap.getAddr(x, y); | 366 void* dstPixels = fBitmap.getAddr(x, y); |
| 365 size_t dstRowBytes = fBitmap.rowBytes(); | 367 size_t dstRowBytes = fBitmap.rowBytes(); |
| 366 | 368 |
| 367 if (write_pixels(dstInfo, dstPixels, dstRowBytes, srcInfo, srcPixels, srcRow
Bytes)) { | 369 if (copy_pixels(dstInfo, dstPixels, dstRowBytes, srcInfo, srcPixels, srcRowB
ytes)) { |
| 368 fBitmap.notifyPixelsChanged(); | 370 fBitmap.notifyPixelsChanged(); |
| 369 return true; | 371 return true; |
| 370 } | 372 } |
| 371 return false; | 373 return false; |
| 372 } | 374 } |
| 373 | 375 |
| 376 bool SkBitmapDevice::onReadPixels(const SkImageInfo& dstInfo, void* dstPixels, s
ize_t dstRowBytes, |
| 377 int x, int y) { |
| 378 // since we don't stop creating un-pixeled devices yet, check for no pixels
here |
| 379 if (NULL == fBitmap.getPixels()) { |
| 380 return false; |
| 381 } |
| 382 |
| 383 SkImageInfo srcInfo = fBitmap.info(); |
| 384 |
| 385 // perhaps can relax these in the future |
| 386 if (4 != dstInfo.bytesPerPixel()) { |
| 387 return false; |
| 388 } |
| 389 if (4 != srcInfo.bytesPerPixel()) { |
| 390 return false; |
| 391 } |
| 392 |
| 393 srcInfo.fWidth = dstInfo.width(); |
| 394 srcInfo.fHeight = dstInfo.height(); |
| 395 |
| 396 const void* srcPixels = fBitmap.getAddr(x, y); |
| 397 const size_t srcRowBytes = fBitmap.rowBytes(); |
| 398 |
| 399 return copy_pixels(dstInfo, dstPixels, dstRowBytes, srcInfo, srcPixels, srcR
owBytes); |
| 400 } |
| 401 |
| 374 /////////////////////////////////////////////////////////////////////////////// | 402 /////////////////////////////////////////////////////////////////////////////// |
| 375 | 403 |
| 376 void SkBitmapDevice::drawPaint(const SkDraw& draw, const SkPaint& paint) { | 404 void SkBitmapDevice::drawPaint(const SkDraw& draw, const SkPaint& paint) { |
| 377 draw.drawPaint(paint); | 405 draw.drawPaint(paint); |
| 378 } | 406 } |
| 379 | 407 |
| 380 void SkBitmapDevice::drawPoints(const SkDraw& draw, SkCanvas::PointMode mode, si
ze_t count, | 408 void SkBitmapDevice::drawPoints(const SkDraw& draw, SkCanvas::PointMode mode, si
ze_t count, |
| 381 const SkPoint pts[], const SkPaint& paint) { | 409 const SkPoint pts[], const SkPaint& paint) { |
| 382 CHECK_FOR_ANNOTATION(paint); | 410 CHECK_FOR_ANNOTATION(paint); |
| 383 draw.drawPoints(mode, count, pts, paint); | 411 draw.drawPoints(mode, count, pts, paint); |
| (...skipping 196 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 580 paint.getStyle() != SkPaint::kFill_Style || | 608 paint.getStyle() != SkPaint::kFill_Style || |
| 581 !SkXfermode::IsMode(paint.getXfermode(), SkXfermode::kSrcOver_Mode)) { | 609 !SkXfermode::IsMode(paint.getXfermode(), SkXfermode::kSrcOver_Mode)) { |
| 582 // turn off lcd | 610 // turn off lcd |
| 583 flags->fFlags = paint.getFlags() & ~SkPaint::kLCDRenderText_Flag; | 611 flags->fFlags = paint.getFlags() & ~SkPaint::kLCDRenderText_Flag; |
| 584 flags->fHinting = paint.getHinting(); | 612 flags->fHinting = paint.getHinting(); |
| 585 return true; | 613 return true; |
| 586 } | 614 } |
| 587 // we're cool with the paint as is | 615 // we're cool with the paint as is |
| 588 return false; | 616 return false; |
| 589 } | 617 } |
| OLD | NEW |