short circuit high quality scales that are actually the identity
transform BUG=skia: R=reed@google.com Author: humper@google.com Review URL: https://codereview.chromium.org/456843002
This commit is contained in:
parent
8875a04136
commit
8d9153fca2
@ -167,6 +167,22 @@ bool SkBitmapProcState::possiblyScaleImage() {
|
||||
SkScalar invScaleX = fInvMatrix.getScaleX();
|
||||
SkScalar invScaleY = fInvMatrix.getScaleY();
|
||||
|
||||
if (SkScalarNearlyEqual(invScaleX,1.0f) &&
|
||||
SkScalarNearlyEqual(invScaleY,1.0f)) {
|
||||
// short-circuit identity scaling; the output is supposed to
|
||||
// be the same as the input, so we might as well go fast.
|
||||
|
||||
// Note(humper): We could also probably do this if the scales
|
||||
// are close to -1 as well, since the flip doesn't require
|
||||
// any fancy re-sampling...
|
||||
|
||||
// Set our filter level to low -- the only post-filtering this
|
||||
// image might require is some interpolation if the translation
|
||||
// is fractional.
|
||||
fFilterLevel = SkPaint::kLow_FilterLevel;
|
||||
return false;
|
||||
}
|
||||
|
||||
fScaledCacheID = SkScaledImageCache::FindAndLock(fOrigBitmap,
|
||||
invScaleX, invScaleY,
|
||||
&fScaledBitmap);
|
||||
@ -218,8 +234,10 @@ bool SkBitmapProcState::possiblyScaleImage() {
|
||||
fInvMatrix.setTranslate(fInvMatrix.getTranslateX() / fInvMatrix.getScaleX(),
|
||||
fInvMatrix.getTranslateY() / fInvMatrix.getScaleY());
|
||||
|
||||
// no need for any further filtering; we just did it!
|
||||
fFilterLevel = SkPaint::kNone_FilterLevel;
|
||||
// Set our filter level to low -- the only post-filtering this
|
||||
// image might require is some interpolation if the translation
|
||||
// is fractional.
|
||||
fFilterLevel = SkPaint::kLow_FilterLevel;
|
||||
unlocker.release();
|
||||
return true;
|
||||
}
|
||||
|
@ -477,8 +477,7 @@ static void mirrorx_nofilter_trans(const SkBitmapProcState& s,
|
||||
SkBitmapProcState::MatrixProc SkBitmapProcState::chooseMatrixProc(bool trivial_matrix) {
|
||||
// test_int_tileprocs();
|
||||
// check for our special case when there is no scale/affine/perspective
|
||||
if (trivial_matrix) {
|
||||
SkASSERT(SkPaint::kNone_FilterLevel == fFilterLevel);
|
||||
if (trivial_matrix && SkPaint::kNone_FilterLevel == fFilterLevel) {
|
||||
fIntTileProcY = choose_int_tile_proc(fTileModeY);
|
||||
switch (fTileModeX) {
|
||||
case SkShader::kClamp_TileMode:
|
||||
|
Loading…
Reference in New Issue
Block a user