| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright 2011 Google Inc. | 2 * Copyright 2011 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 "SkBitmapCache.h" | 8 #include "SkBitmapCache.h" |
| 9 #include "SkBitmapProcState.h" | 9 #include "SkBitmapProcState.h" |
| 10 #include "SkColorPriv.h" | 10 #include "SkColorPriv.h" |
| (...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 122 < (maximumAllocation * invMat.getScaleX() * invMat.getScaleY()); | 122 < (maximumAllocation * invMat.getScaleX() * invMat.getScaleY()); |
| 123 } | 123 } |
| 124 | 124 |
| 125 // TODO -- we may want to pass the clip into this function so we only scale | 125 // TODO -- we may want to pass the clip into this function so we only scale |
| 126 // the portion of the image that we're going to need. This will complicate | 126 // the portion of the image that we're going to need. This will complicate |
| 127 // the interface to the cache, but might be well worth it. | 127 // the interface to the cache, but might be well worth it. |
| 128 | 128 |
| 129 bool SkBitmapProcState::possiblyScaleImage() { | 129 bool SkBitmapProcState::possiblyScaleImage() { |
| 130 SkASSERT(NULL == fBitmap); | 130 SkASSERT(NULL == fBitmap); |
| 131 | 131 |
| 132 fAdjustedMatrix = false; | |
| 133 | |
| 134 if (fFilterLevel <= SkPaint::kLow_FilterLevel) { | 132 if (fFilterLevel <= SkPaint::kLow_FilterLevel) { |
| 135 return false; | 133 return false; |
| 136 } | 134 } |
| 137 // Check to see if the transformation matrix is simple, and if we're | 135 // Check to see if the transformation matrix is simple, and if we're |
| 138 // doing high quality scaling. If so, do the bitmap scale here and | 136 // doing high quality scaling. If so, do the bitmap scale here and |
| 139 // remove the (non-fractional) scaling component from the matrix. | 137 // remove the (non-fractional) scaling component from the matrix. |
| 140 | 138 |
| 141 SkScalar invScaleX = fInvMatrix.getScaleX(); | 139 SkScalar invScaleX = fInvMatrix.getScaleX(); |
| 142 SkScalar invScaleY = fInvMatrix.getScaleY(); | 140 SkScalar invScaleY = fInvMatrix.getScaleY(); |
| 143 | 141 |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 189 } | 187 } |
| 190 | 188 |
| 191 SkASSERT(fScaledBitmap.getPixels()); | 189 SkASSERT(fScaledBitmap.getPixels()); |
| 192 fScaledBitmap.setImmutable(); | 190 fScaledBitmap.setImmutable(); |
| 193 SkBitmapCache::Add(fOrigBitmap, roundedDestWidth, roundedDestHeight,
fScaledBitmap); | 191 SkBitmapCache::Add(fOrigBitmap, roundedDestWidth, roundedDestHeight,
fScaledBitmap); |
| 194 } | 192 } |
| 195 | 193 |
| 196 SkASSERT(fScaledBitmap.getPixels()); | 194 SkASSERT(fScaledBitmap.getPixels()); |
| 197 fBitmap = &fScaledBitmap; | 195 fBitmap = &fScaledBitmap; |
| 198 | 196 |
| 199 // set the inv matrix type to translate-only; | 197 // clean up the inverse matrix by incorporating the scale we just perfor
med. |
| 200 fInvMatrix.setTranslate(fInvMatrix.getTranslateX() / fInvMatrix.getScale
X(), | |
| 201 fInvMatrix.getTranslateY() / fInvMatrix.getScale
Y()); | |
| 202 | 198 |
| 203 #ifndef SK_IGNORE_PROPER_FRACTIONAL_SCALING | 199 fInvMatrix.postScale(roundedDestWidth / fOrigBitmap.width(), |
| 204 // reintroduce any fractional scaling missed by our integral scale done
above. | 200 roundedDestHeight / fOrigBitmap.height()); |
| 205 | |
| 206 float fractionalScaleX = roundedDestWidth/trueDestWidth; | |
| 207 float fractionalScaleY = roundedDestHeight/trueDestHeight; | |
| 208 | |
| 209 fInvMatrix.postScale(fractionalScaleX, fractionalScaleY); | |
| 210 #endif | |
| 211 fAdjustedMatrix = true; | |
| 212 | 201 |
| 213 // Set our filter level to low -- the only post-filtering this | 202 // Set our filter level to low -- the only post-filtering this |
| 214 // image might require is some interpolation if the translation | 203 // image might require is some interpolation if the translation |
| 215 // is fractional or if there's any remaining scaling to be done. | 204 // is fractional or if there's any remaining scaling to be done. |
| 216 fFilterLevel = SkPaint::kLow_FilterLevel; | 205 fFilterLevel = SkPaint::kLow_FilterLevel; |
| 217 return true; | 206 return true; |
| 218 } | 207 } |
| 219 | 208 |
| 220 /* | 209 /* |
| 221 * If High, then our special-case for scale-only did not take, and so we | 210 * If High, then our special-case for scale-only did not take, and so we |
| (...skipping 143 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 365 // If we are "still" kMedium_FilterLevel, then the request was not fulfilled
by possiblyScale, | 354 // If we are "still" kMedium_FilterLevel, then the request was not fulfilled
by possiblyScale, |
| 366 // so we downgrade to kLow (so the rest of the sniffing code can assume that
) | 355 // so we downgrade to kLow (so the rest of the sniffing code can assume that
) |
| 367 if (SkPaint::kMedium_FilterLevel == fFilterLevel) { | 356 if (SkPaint::kMedium_FilterLevel == fFilterLevel) { |
| 368 fFilterLevel = SkPaint::kLow_FilterLevel; | 357 fFilterLevel = SkPaint::kLow_FilterLevel; |
| 369 } | 358 } |
| 370 | 359 |
| 371 bool trivialMatrix = (fInvMatrix.getType() & ~SkMatrix::kTranslate_Mask) ==
0; | 360 bool trivialMatrix = (fInvMatrix.getType() & ~SkMatrix::kTranslate_Mask) ==
0; |
| 372 bool clampClamp = SkShader::kClamp_TileMode == fTileModeX && | 361 bool clampClamp = SkShader::kClamp_TileMode == fTileModeX && |
| 373 SkShader::kClamp_TileMode == fTileModeY; | 362 SkShader::kClamp_TileMode == fTileModeY; |
| 374 | 363 |
| 375 if (!(fAdjustedMatrix || clampClamp || trivialMatrix)) { | 364 // TODO(reed): The following conditional and matrix division could really us
e |
| 376 fInvMatrix.postIDiv(fOrigBitmap.width(), fOrigBitmap.height()); | 365 // a comment! |
| 366 |
| 367 if (!(clampClamp || trivialMatrix)) { |
| 368 fInvMatrix.postIDiv(fBitmap->width(), fBitmap->height()); |
| 377 } | 369 } |
| 378 | 370 |
| 379 // Now that all possible changes to the matrix have taken place, check | 371 // Now that all possible changes to the matrix have taken place, check |
| 380 // to see if we're really close to a no-scale matrix. If so, explicitly | 372 // to see if we're really close to a no-scale matrix. If so, explicitly |
| 381 // set it to be so. Subsequent code may inspect this matrix to choose | 373 // set it to be so. Subsequent code may inspect this matrix to choose |
| 382 // a faster path in this case. | 374 // a faster path in this case. |
| 383 | 375 |
| 384 // This code will only execute if the matrix has some scale component; | 376 // This code will only execute if the matrix has some scale component; |
| 385 // if it's already pure translate then we won't do this inversion. | 377 // if it's already pure translate then we won't do this inversion. |
| 386 | 378 |
| (...skipping 625 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1012 } else { | 1004 } else { |
| 1013 size >>= 2; | 1005 size >>= 2; |
| 1014 } | 1006 } |
| 1015 | 1007 |
| 1016 if (fFilterLevel != SkPaint::kNone_FilterLevel) { | 1008 if (fFilterLevel != SkPaint::kNone_FilterLevel) { |
| 1017 size >>= 1; | 1009 size >>= 1; |
| 1018 } | 1010 } |
| 1019 | 1011 |
| 1020 return size; | 1012 return size; |
| 1021 } | 1013 } |
| OLD | NEW |