Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 /* | 1 /* |
| 2 * Copyright (c) 2008, Google Inc. All rights reserved. | 2 * Copyright (c) 2008, Google Inc. All rights reserved. |
| 3 * | 3 * |
| 4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
| 5 * modification, are permitted provided that the following conditions are | 5 * modification, are permitted provided that the following conditions are |
| 6 * met: | 6 * met: |
| 7 * | 7 * |
| 8 * * Redistributions of source code must retain the above copyright | 8 * * Redistributions of source code must retain the above copyright |
| 9 * notice, this list of conditions and the following disclaimer. | 9 * notice, this list of conditions and the following disclaimer. |
| 10 * * Redistributions in binary form must reproduce the above | 10 * * Redistributions in binary form must reproduce the above |
| (...skipping 357 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 368 void NativeImageSkia::draw(GraphicsContext* context, const SkRect& srcRect, cons t SkRect& destRect, PassRefPtr<SkXfermode> compOp) const | 368 void NativeImageSkia::draw(GraphicsContext* context, const SkRect& srcRect, cons t SkRect& destRect, PassRefPtr<SkXfermode> compOp) const |
| 369 { | 369 { |
| 370 TRACE_EVENT0("skia", "NativeImageSkia::draw"); | 370 TRACE_EVENT0("skia", "NativeImageSkia::draw"); |
| 371 SkPaint paint; | 371 SkPaint paint; |
| 372 paint.setXfermode(compOp.get()); | 372 paint.setXfermode(compOp.get()); |
| 373 paint.setColorFilter(context->colorFilter()); | 373 paint.setColorFilter(context->colorFilter()); |
| 374 paint.setAlpha(context->getNormalizedAlpha()); | 374 paint.setAlpha(context->getNormalizedAlpha()); |
| 375 paint.setLooper(context->drawLooper()); | 375 paint.setLooper(context->drawLooper()); |
| 376 paint.setAntiAlias(shouldDrawAntiAliased(context, destRect)); | 376 paint.setAntiAlias(shouldDrawAntiAliased(context, destRect)); |
| 377 | 377 |
| 378 ResamplingMode resampling; | 378 bool isLazyDecoded = DeferredImageDecoder::isLazyDecoded(bitmap()); |
| 379 | |
| 380 ResamplingMode resampling = AwesomeResampling; | |
| 379 if (context->isAccelerated()) { | 381 if (context->isAccelerated()) { |
| 380 resampling = LinearResampling; | 382 resampling = LinearResampling; |
| 381 } else if (context->printing()) { | 383 } else if (context->printing()) { |
| 382 resampling = NoResampling; | 384 resampling = NoResampling; |
| 383 } else { | 385 } else if (!isLazyDecoded) { |
| 384 // Take into account scale applied to the canvas when computing sampling mode (e.g. CSS scale or page scale). | 386 // Take into account scale applied to the canvas when computing sampling mode (e.g. CSS scale or page scale). |
| 385 SkRect destRectTarget = destRect; | 387 SkRect destRectTarget = destRect; |
| 386 SkMatrix totalMatrix = context->getTotalMatrix(); | 388 SkMatrix totalMatrix = context->getTotalMatrix(); |
| 387 if (!(totalMatrix.getType() & (SkMatrix::kAffine_Mask | SkMatrix::kPersp ective_Mask))) | 389 if (!(totalMatrix.getType() & (SkMatrix::kAffine_Mask | SkMatrix::kPersp ective_Mask))) |
| 388 totalMatrix.mapRect(&destRectTarget, destRect); | 390 totalMatrix.mapRect(&destRectTarget, destRect); |
| 389 | 391 |
| 390 resampling = computeResamplingMode(totalMatrix, | 392 resampling = computeResamplingMode(totalMatrix, |
| 391 SkScalarToFloat(srcRect.width()), SkScalarToFloat(srcRect.height()), | 393 SkScalarToFloat(srcRect.width()), SkScalarToFloat(srcRect.height()), |
| 392 SkScalarToFloat(destRectTarget.width()), SkScalarToFloat(destRectTar get.height())); | 394 SkScalarToFloat(destRectTarget.width()), SkScalarToFloat(destRectTar get.height())); |
| 393 } | 395 } |
| 394 | 396 |
| 395 if (resampling == NoResampling) { | 397 if (resampling == NoResampling) { |
| 396 // FIXME: This is to not break tests (it results in the filter bitmap fl ag | 398 // FIXME: This is to not break tests (it results in the filter bitmap fl ag |
| 397 // being set to true). We need to decide if we respect NoResampling | 399 // being set to true). We need to decide if we respect NoResampling |
| 398 // being returned from computeResamplingMode. | 400 // being returned from computeResamplingMode. |
| 399 resampling = LinearResampling; | 401 resampling = LinearResampling; |
| 400 } | 402 } |
| 401 resampling = limitResamplingMode(context, resampling); | 403 resampling = limitResamplingMode(context, resampling); |
| 402 | 404 |
| 403 bool isLazyDecoded = DeferredImageDecoder::isLazyDecoded(bitmap()); | |
| 404 // FIXME: Bicubic filtering in Skia is only applied to defer-decoded images | 405 // FIXME: Bicubic filtering in Skia is only applied to defer-decoded images |
| 405 // as an experiment. Once this filtering code path becomes stable we should | 406 // as an experiment. Once this filtering code path becomes stable we should |
| 406 // turn this on for all cases, including non-defer-decoded images. | 407 // turn this on for all cases, including non-defer-decoded images. |
| 407 bool useBicubicFilter = resampling == AwesomeResampling && isLazyDecoded; | 408 bool useBicubicFilter = resampling == AwesomeResampling && isLazyDecoded; |
| 408 | 409 |
| 409 paint.setFilterLevel(convertToSkiaFilterLevel(useBicubicFilter, resampling)) ; | 410 paint.setFilterLevel(convertToSkiaFilterLevel(useBicubicFilter, resampling)) ; |
| 410 | 411 |
| 411 if (resampling == AwesomeResampling && !useBicubicFilter) { | 412 if (resampling == AwesomeResampling && !useBicubicFilter) { |
| 412 // Resample the image and then draw the result to canvas with bilinear | 413 // Resample the image and then draw the result to canvas with bilinear |
| 413 // filtering. | 414 // filtering. |
| (...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 462 | 463 |
| 463 // Figure out what size the bitmap will be in the destination. The | 464 // Figure out what size the bitmap will be in the destination. The |
| 464 // destination rect is the bounds of the pattern, we need to use the | 465 // destination rect is the bounds of the pattern, we need to use the |
| 465 // matrix to see how big it will be. | 466 // matrix to see how big it will be. |
| 466 SkRect destRectTarget; | 467 SkRect destRectTarget; |
| 467 totalMatrix.mapRect(&destRectTarget, normSrcRect); | 468 totalMatrix.mapRect(&destRectTarget, normSrcRect); |
| 468 | 469 |
| 469 float destBitmapWidth = SkScalarToFloat(destRectTarget.width()); | 470 float destBitmapWidth = SkScalarToFloat(destRectTarget.width()); |
| 470 float destBitmapHeight = SkScalarToFloat(destRectTarget.height()); | 471 float destBitmapHeight = SkScalarToFloat(destRectTarget.height()); |
| 471 | 472 |
| 473 bool isLazyDecoded = DeferredImageDecoder::isLazyDecoded(bitmap()); | |
| 474 | |
| 472 // Compute the resampling mode. | 475 // Compute the resampling mode. |
| 473 ResamplingMode resampling; | 476 ResamplingMode resampling = AwesomeResampling; |
|
Stephen White
2014/05/07 18:16:31
Same here.
reveman
2014/05/07 19:00:46
Done.
| |
| 474 if (context->isAccelerated() || context->printing()) | 477 if (context->isAccelerated() || context->printing()) |
| 475 resampling = LinearResampling; | 478 resampling = LinearResampling; |
| 476 else | 479 else if (!isLazyDecoded) |
| 477 resampling = computeResamplingMode(totalMatrix, normSrcRect.width(), nor mSrcRect.height(), destBitmapWidth, destBitmapHeight); | 480 resampling = computeResamplingMode(totalMatrix, normSrcRect.width(), nor mSrcRect.height(), destBitmapWidth, destBitmapHeight); |
| 478 resampling = limitResamplingMode(context, resampling); | 481 resampling = limitResamplingMode(context, resampling); |
| 479 | 482 |
| 480 SkMatrix shaderTransform; | 483 SkMatrix shaderTransform; |
| 481 RefPtr<SkShader> shader; | 484 RefPtr<SkShader> shader; |
| 482 | 485 |
| 483 bool isLazyDecoded = DeferredImageDecoder::isLazyDecoded(bitmap()); | |
| 484 // Bicubic filter is only applied to defer-decoded images, see | 486 // Bicubic filter is only applied to defer-decoded images, see |
| 485 // NativeImageSkia::draw for details. | 487 // NativeImageSkia::draw for details. |
| 486 bool useBicubicFilter = resampling == AwesomeResampling && isLazyDecoded; | 488 bool useBicubicFilter = resampling == AwesomeResampling && isLazyDecoded; |
| 487 | 489 |
| 488 if (resampling == AwesomeResampling && !useBicubicFilter) { | 490 if (resampling == AwesomeResampling && !useBicubicFilter) { |
| 489 // Do nice resampling. | 491 // Do nice resampling. |
| 490 float scaleX = destBitmapWidth / normSrcRect.width(); | 492 float scaleX = destBitmapWidth / normSrcRect.width(); |
| 491 float scaleY = destBitmapHeight / normSrcRect.height(); | 493 float scaleY = destBitmapHeight / normSrcRect.height(); |
| 492 SkRect scaledSrcRect; | 494 SkRect scaledSrcRect; |
| 493 | 495 |
| (...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 615 SkIRect NativeImageSkia::ImageResourceInfo::rectInSubset(const SkIRect& otherSca ledImageSubset) | 617 SkIRect NativeImageSkia::ImageResourceInfo::rectInSubset(const SkIRect& otherSca ledImageSubset) |
| 616 { | 618 { |
| 617 if (!scaledImageSubset.contains(otherScaledImageSubset)) | 619 if (!scaledImageSubset.contains(otherScaledImageSubset)) |
| 618 return SkIRect::MakeEmpty(); | 620 return SkIRect::MakeEmpty(); |
| 619 SkIRect subsetRect = otherScaledImageSubset; | 621 SkIRect subsetRect = otherScaledImageSubset; |
| 620 subsetRect.offset(-scaledImageSubset.x(), -scaledImageSubset.y()); | 622 subsetRect.offset(-scaledImageSubset.x(), -scaledImageSubset.y()); |
| 621 return subsetRect; | 623 return subsetRect; |
| 622 } | 624 } |
| 623 | 625 |
| 624 } // namespace WebCore | 626 } // namespace WebCore |
| OLD | NEW |