| OLD | NEW |
| 1 | 1 |
| 2 /* | 2 /* |
| 3 * Copyright 2011 Google Inc. | 3 * Copyright 2011 Google Inc. |
| 4 * | 4 * |
| 5 * Use of this source code is governed by a BSD-style license that can be | 5 * Use of this source code is governed by a BSD-style license that can be |
| 6 * found in the LICENSE file. | 6 * found in the LICENSE file. |
| 7 */ | 7 */ |
| 8 #include "SkBitmapProcState.h" | 8 #include "SkBitmapProcState.h" |
| 9 #include "SkColorPriv.h" | 9 #include "SkColorPriv.h" |
| 10 #include "SkFilterProc.h" | 10 #include "SkFilterProc.h" |
| (...skipping 245 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 256 const SkMipMap* mip = NULL; | 256 const SkMipMap* mip = NULL; |
| 257 | 257 |
| 258 SkASSERT(NULL == fScaledCacheID); | 258 SkASSERT(NULL == fScaledCacheID); |
| 259 fScaledCacheID = SkScaledImageCache::FindAndLockMip(fOrigBitmap, &mip); | 259 fScaledCacheID = SkScaledImageCache::FindAndLockMip(fOrigBitmap, &mip); |
| 260 if (!fScaledCacheID) { | 260 if (!fScaledCacheID) { |
| 261 SkASSERT(NULL == mip); | 261 SkASSERT(NULL == mip); |
| 262 mip = SkMipMap::Build(fOrigBitmap); | 262 mip = SkMipMap::Build(fOrigBitmap); |
| 263 if (mip) { | 263 if (mip) { |
| 264 fScaledCacheID = SkScaledImageCache::AddAndLockMip(fOrigBitmap, | 264 fScaledCacheID = SkScaledImageCache::AddAndLockMip(fOrigBitmap, |
| 265 mip); | 265 mip); |
| 266 SkASSERT(mip->getRefCnt() > 1); |
| 266 mip->unref(); // the cache took a ref | 267 mip->unref(); // the cache took a ref |
| 267 SkASSERT(fScaledCacheID); | 268 SkASSERT(fScaledCacheID); |
| 268 } | 269 } |
| 269 } else { | 270 } else { |
| 270 SkASSERT(mip); | 271 SkASSERT(mip); |
| 271 } | 272 } |
| 272 | 273 |
| 273 if (mip) { | 274 if (mip) { |
| 274 SkScalar levelScale = SkScalarInvert(SkScalarSqrt(scaleSqd)); | 275 SkScalar levelScale = SkScalarInvert(SkScalarSqrt(scaleSqd)); |
| 275 SkMipMap::Level level; | 276 SkMipMap::Level level; |
| (...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 376 } | 377 } |
| 377 SkDELETE(fBitmapFilter); | 378 SkDELETE(fBitmapFilter); |
| 378 } | 379 } |
| 379 | 380 |
| 380 bool SkBitmapProcState::chooseProcs(const SkMatrix& inv, const SkPaint& paint) { | 381 bool SkBitmapProcState::chooseProcs(const SkMatrix& inv, const SkPaint& paint) { |
| 381 SkASSERT(fOrigBitmap.width() && fOrigBitmap.height()); | 382 SkASSERT(fOrigBitmap.width() && fOrigBitmap.height()); |
| 382 | 383 |
| 383 fBitmap = NULL; | 384 fBitmap = NULL; |
| 384 fInvMatrix = inv; | 385 fInvMatrix = inv; |
| 385 fFilterLevel = paint.getFilterLevel(); | 386 fFilterLevel = paint.getFilterLevel(); |
| 387 // fFilterLevel = SkPaint::kMedium_FilterLevel; |
| 386 | 388 |
| 387 SkASSERT(NULL == fScaledCacheID); | 389 SkASSERT(NULL == fScaledCacheID); |
| 388 | 390 |
| 389 // possiblyScaleImage will look to see if it can rescale the image as a | 391 // possiblyScaleImage will look to see if it can rescale the image as a |
| 390 // preprocess; either by scaling up to the target size, or by selecting | 392 // preprocess; either by scaling up to the target size, or by selecting |
| 391 // a nearby mipmap level. If it does, it will adjust the working | 393 // a nearby mipmap level. If it does, it will adjust the working |
| 392 // matrix as well as the working bitmap. It may also adjust the filter | 394 // matrix as well as the working bitmap. It may also adjust the filter |
| 393 // quality to avoid re-filtering an already perfectly scaled image. | 395 // quality to avoid re-filtering an already perfectly scaled image. |
| 394 if (!this->possiblyScaleImage()) { | 396 if (!this->possiblyScaleImage()) { |
| 395 if (!this->lockBaseBitmap()) { | 397 if (!this->lockBaseBitmap()) { |
| 396 return false; | 398 return false; |
| 397 } | 399 } |
| 398 } | 400 } |
| 399 // The above logic should have always assigned fBitmap, but in case it | 401 // The above logic should have always assigned fBitmap, but in case it |
| 400 // didn't, we check for that now... | 402 // didn't, we check for that now... |
| 401 // TODO(dominikg): Ask humper@ if we can just use an SkASSERT(fBitmap)? | 403 // TODO(dominikg): Ask humper@ if we can just use an SkASSERT(fBitmap)? |
| 402 if (NULL == fBitmap) { | 404 if (NULL == fBitmap) { |
| 403 return false; | 405 return false; |
| 404 } | 406 } |
| 405 | 407 |
| 408 // If we are "still" kMedium_FilterLeve, then then request was not fulfilled
by possiblyScale, |
| 409 // so we downgrade to kLow (so the rest of the sniffing code can assume that |
| 410 if (SkPaint::kMedium_FilterLevel == fFilterLevel) { |
| 411 fFilterLevel = SkPaint::kLow_FilterLevel; |
| 412 } |
| 413 |
| 406 bool trivialMatrix = (fInvMatrix.getType() & ~SkMatrix::kTranslate_Mask) ==
0; | 414 bool trivialMatrix = (fInvMatrix.getType() & ~SkMatrix::kTranslate_Mask) ==
0; |
| 407 bool clampClamp = SkShader::kClamp_TileMode == fTileModeX && | 415 bool clampClamp = SkShader::kClamp_TileMode == fTileModeX && |
| 408 SkShader::kClamp_TileMode == fTileModeY; | 416 SkShader::kClamp_TileMode == fTileModeY; |
| 409 | 417 |
| 410 if (!(clampClamp || trivialMatrix)) { | 418 if (!(clampClamp || trivialMatrix)) { |
| 411 fInvMatrix.postIDiv(fOrigBitmap.width(), fOrigBitmap.height()); | 419 fInvMatrix.postIDiv(fOrigBitmap.width(), fOrigBitmap.height()); |
| 412 } | 420 } |
| 413 | 421 |
| 414 // Now that all possible changes to the matrix have taken place, check | 422 // Now that all possible changes to the matrix have taken place, check |
| 415 // to see if we're really close to a no-scale matrix. If so, explicitly | 423 // to see if we're really close to a no-scale matrix. If so, explicitly |
| (...skipping 620 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1036 } else { | 1044 } else { |
| 1037 size >>= 2; | 1045 size >>= 2; |
| 1038 } | 1046 } |
| 1039 | 1047 |
| 1040 if (fFilterLevel != SkPaint::kNone_FilterLevel) { | 1048 if (fFilterLevel != SkPaint::kNone_FilterLevel) { |
| 1041 size >>= 1; | 1049 size >>= 1; |
| 1042 } | 1050 } |
| 1043 | 1051 |
| 1044 return size; | 1052 return size; |
| 1045 } | 1053 } |
| OLD | NEW |