| 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 250 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 261 // needed (if the src was clipped). No check needed if src==null. | 261 // needed (if the src was clipped). No check needed if src==null. |
| 262 if (src) { | 262 if (src) { |
| 263 if (!bitmapBounds.contains(*src)) { | 263 if (!bitmapBounds.contains(*src)) { |
| 264 if (!tmpSrc.intersect(bitmapBounds)) { | 264 if (!tmpSrc.intersect(bitmapBounds)) { |
| 265 return; // nothing to draw | 265 return; // nothing to draw |
| 266 } | 266 } |
| 267 // recompute dst, based on the smaller tmpSrc | 267 // recompute dst, based on the smaller tmpSrc |
| 268 matrix.mapRect(&tmpDst, tmpSrc); | 268 matrix.mapRect(&tmpDst, tmpSrc); |
| 269 dstPtr = &tmpDst; | 269 dstPtr = &tmpDst; |
| 270 } | 270 } |
| 271 } |
| 271 | 272 |
| 273 if (src && !src->contains(bitmapBounds) && |
| 274 SkCanvas::kFast_SrcRectConstraint == constraint && |
| 275 paint.getFilterQuality() != kNone_SkFilterQuality) { |
| 276 // src is smaller than the bounds of the bitmap, and we are filtering, s
o we don't know |
| 277 // how much more of the bitmap we need, so we can't use extractSubset or
drawBitmap, |
| 278 // but we must use a shader w/ dst bounds (which can access all of the b
itmap needed). |
| 279 goto USE_SHADER; |
| 280 } |
| 281 |
| 282 if (src) { |
| 272 // since we may need to clamp to the borders of the src rect within | 283 // since we may need to clamp to the borders of the src rect within |
| 273 // the bitmap, we extract a subset. | 284 // the bitmap, we extract a subset. |
| 274 const SkIRect srcIR = tmpSrc.roundOut(); | 285 const SkIRect srcIR = tmpSrc.roundOut(); |
| 275 if(bitmap.pixelRef()->getTexture()) { | 286 if(bitmap.pixelRef()->getTexture()) { |
| 276 // Accelerated source canvas, don't use extractSubset but readPixels
to get the subset. | 287 // Accelerated source canvas, don't use extractSubset but readPixels
to get the subset. |
| 277 // This way, the pixels are copied in CPU memory instead of GPU memo
ry. | 288 // This way, the pixels are copied in CPU memory instead of GPU memo
ry. |
| 278 bitmap.pixelRef()->readPixels(&tmpBitmap, kN32_SkColorType, &srcIR); | 289 bitmap.pixelRef()->readPixels(&tmpBitmap, kN32_SkColorType, &srcIR); |
| 279 } else { | 290 } else { |
| 280 if (!bitmap.extractSubset(&tmpBitmap, srcIR)) { | 291 if (!bitmap.extractSubset(&tmpBitmap, srcIR)) { |
| 281 return; | 292 return; |
| (...skipping 21 matching lines...) Expand all Loading... |
| 303 } | 314 } |
| 304 } else { | 315 } else { |
| 305 USE_DRAWBITMAP: | 316 USE_DRAWBITMAP: |
| 306 // We can go faster by just calling drawBitmap, which will concat the | 317 // We can go faster by just calling drawBitmap, which will concat the |
| 307 // matrix with the CTM, and try to call drawSprite if it can. If not, | 318 // matrix with the CTM, and try to call drawSprite if it can. If not, |
| 308 // it will make a shader and call drawRect, as we do below. | 319 // it will make a shader and call drawRect, as we do below. |
| 309 draw.drawBitmap(*bitmapPtr, matrix, dstPtr, paint); | 320 draw.drawBitmap(*bitmapPtr, matrix, dstPtr, paint); |
| 310 return; | 321 return; |
| 311 } | 322 } |
| 312 | 323 |
| 324 USE_SHADER: |
| 313 // construct a shader, so we can call drawRect with the dst | 325 // construct a shader, so we can call drawRect with the dst |
| 314 auto s = SkShader::MakeBitmapShader(*bitmapPtr, SkShader::kClamp_TileMode, | 326 auto s = SkShader::MakeBitmapShader(*bitmapPtr, SkShader::kClamp_TileMode, |
| 315 SkShader::kClamp_TileMode, &matrix); | 327 SkShader::kClamp_TileMode, &matrix); |
| 316 if (!s) { | 328 if (!s) { |
| 317 return; | 329 return; |
| 318 } | 330 } |
| 319 | 331 |
| 320 SkPaint paintWithShader(paint); | 332 SkPaint paintWithShader(paint); |
| 321 paintWithShader.setStyle(SkPaint::kFill_Style); | 333 paintWithShader.setStyle(SkPaint::kFill_Style); |
| 322 paintWithShader.setShader(std::move(s)); | 334 paintWithShader.setShader(std::move(s)); |
| (...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 422 paint.getRasterizer() || | 434 paint.getRasterizer() || |
| 423 paint.getPathEffect() || | 435 paint.getPathEffect() || |
| 424 paint.isFakeBoldText() || | 436 paint.isFakeBoldText() || |
| 425 paint.getStyle() != SkPaint::kFill_Style || | 437 paint.getStyle() != SkPaint::kFill_Style || |
| 426 !SkXfermode::IsMode(paint.getXfermode(), SkXfermode::kSrcOver_Mode)) | 438 !SkXfermode::IsMode(paint.getXfermode(), SkXfermode::kSrcOver_Mode)) |
| 427 { | 439 { |
| 428 return true; | 440 return true; |
| 429 } | 441 } |
| 430 return false; | 442 return false; |
| 431 } | 443 } |
| OLD | NEW |