OLD | NEW |
1 /* | 1 /* |
2 * Copyright 2015 Google Inc. | 2 * Copyright 2015 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 "SkBitmap.h" | 8 #include "SkBitmap.h" |
9 #include "SkBitmapController.h" | 9 #include "SkBitmapController.h" |
10 #include "SkBitmapProvider.h" | 10 #include "SkBitmapProvider.h" |
(...skipping 26 matching lines...) Expand all Loading... |
37 | 37 |
38 ////////////////////////////////////////////////////////////////////////////////
/////////////////// | 38 ////////////////////////////////////////////////////////////////////////////////
/////////////////// |
39 | 39 |
40 #include "SkBitmapCache.h" | 40 #include "SkBitmapCache.h" |
41 #include "SkBitmapScaler.h" | 41 #include "SkBitmapScaler.h" |
42 #include "SkMipMap.h" | 42 #include "SkMipMap.h" |
43 #include "SkResourceCache.h" | 43 #include "SkResourceCache.h" |
44 | 44 |
45 class SkDefaultBitmapControllerState : public SkBitmapController::State { | 45 class SkDefaultBitmapControllerState : public SkBitmapController::State { |
46 public: | 46 public: |
47 SkDefaultBitmapControllerState(const SkBitmapProvider&, const SkMatrix& inv,
SkFilterQuality); | 47 SkDefaultBitmapControllerState(const SkBitmapProvider&, const SkMatrix& inv,
SkFilterQuality, |
| 48 SkSourceGammaTreatment); |
48 | 49 |
49 private: | 50 private: |
50 SkBitmap fResultBitmap; | 51 SkBitmap fResultBitmap; |
| 52 SkSourceGammaTreatment fSrcGammaTreatment; |
51 SkAutoTUnref<const SkMipMap> fCurrMip; | 53 SkAutoTUnref<const SkMipMap> fCurrMip; |
52 | 54 |
53 bool processHQRequest(const SkBitmapProvider&); | 55 bool processHQRequest(const SkBitmapProvider&); |
54 bool processMediumRequest(const SkBitmapProvider&); | 56 bool processMediumRequest(const SkBitmapProvider&); |
55 }; | 57 }; |
56 | 58 |
57 // Check to see that the size of the bitmap that would be produced by | 59 // Check to see that the size of the bitmap that would be produced by |
58 // scaling by the given inverted matrix is less than the maximum allowed. | 60 // scaling by the given inverted matrix is less than the maximum allowed. |
59 static inline bool cache_size_okay(const SkBitmapProvider& provider, const SkMat
rix& invMat) { | 61 static inline bool cache_size_okay(const SkBitmapProvider& provider, const SkMat
rix& invMat) { |
60 size_t maximumAllocation = SkResourceCache::GetEffectiveSingleAllocationByte
Limit(); | 62 size_t maximumAllocation = SkResourceCache::GetEffectiveSingleAllocationByte
Limit(); |
(...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
157 // Our default return state is to downgrade the request to Low, w/ or w/o se
tting fBitmap | 159 // Our default return state is to downgrade the request to Low, w/ or w/o se
tting fBitmap |
158 // to a valid bitmap. | 160 // to a valid bitmap. |
159 fQuality = kLow_SkFilterQuality; | 161 fQuality = kLow_SkFilterQuality; |
160 | 162 |
161 SkSize invScaleSize; | 163 SkSize invScaleSize; |
162 if (!fInvMatrix.decomposeScale(&invScaleSize, nullptr)) { | 164 if (!fInvMatrix.decomposeScale(&invScaleSize, nullptr)) { |
163 return false; | 165 return false; |
164 } | 166 } |
165 | 167 |
166 if (invScaleSize.width() > SK_Scalar1 || invScaleSize.height() > SK_Scalar1)
{ | 168 if (invScaleSize.width() > SK_Scalar1 || invScaleSize.height() > SK_Scalar1)
{ |
167 fCurrMip.reset(SkMipMapCache::FindAndRef(provider.makeCacheDesc())); | 169 fCurrMip.reset(SkMipMapCache::FindAndRef(provider.makeCacheDesc(), fSrcG
ammaTreatment)); |
168 if (nullptr == fCurrMip.get()) { | 170 if (nullptr == fCurrMip.get()) { |
169 SkBitmap orig; | 171 SkBitmap orig; |
170 if (!provider.asBitmap(&orig)) { | 172 if (!provider.asBitmap(&orig)) { |
171 return false; | 173 return false; |
172 } | 174 } |
173 fCurrMip.reset(SkMipMapCache::AddAndRef(orig)); | 175 fCurrMip.reset(SkMipMapCache::AddAndRef(orig, fSrcGammaTreatment)); |
174 if (nullptr == fCurrMip.get()) { | 176 if (nullptr == fCurrMip.get()) { |
175 return false; | 177 return false; |
176 } | 178 } |
177 } | 179 } |
178 // diagnostic for a crasher... | 180 // diagnostic for a crasher... |
179 if (nullptr == fCurrMip->data()) { | 181 if (nullptr == fCurrMip->data()) { |
180 sk_throw(); | 182 sk_throw(); |
181 } | 183 } |
182 | 184 |
183 const SkSize scale = SkSize::Make(SkScalarInvert(invScaleSize.width()), | 185 const SkSize scale = SkSize::Make(SkScalarInvert(invScaleSize.width()), |
184 SkScalarInvert(invScaleSize.height()))
; | 186 SkScalarInvert(invScaleSize.height()))
; |
185 SkMipMap::Level level; | 187 SkMipMap::Level level; |
186 if (fCurrMip->extractLevel(scale, &level)) { | 188 if (fCurrMip->extractLevel(scale, &level)) { |
187 const SkSize& invScaleFixup = level.fScale; | 189 const SkSize& invScaleFixup = level.fScale; |
188 fInvMatrix.postScale(invScaleFixup.width(), invScaleFixup.height()); | 190 fInvMatrix.postScale(invScaleFixup.width(), invScaleFixup.height()); |
189 | 191 |
190 // todo: if we could wrap the fCurrMip in a pixelref, then we could
just install | 192 // todo: if we could wrap the fCurrMip in a pixelref, then we could
just install |
191 // that here, and not need to explicitly track it ourselves. | 193 // that here, and not need to explicitly track it ourselves. |
192 return fResultBitmap.installPixels(level.fPixmap); | 194 return fResultBitmap.installPixels(level.fPixmap); |
193 } else { | 195 } else { |
194 // failed to extract, so release the mipmap | 196 // failed to extract, so release the mipmap |
195 fCurrMip.reset(nullptr); | 197 fCurrMip.reset(nullptr); |
196 } | 198 } |
197 } | 199 } |
198 return false; | 200 return false; |
199 } | 201 } |
200 | 202 |
201 SkDefaultBitmapControllerState::SkDefaultBitmapControllerState(const SkBitmapPro
vider& provider, | 203 SkDefaultBitmapControllerState::SkDefaultBitmapControllerState(const SkBitmapPro
vider& provider, |
202 const SkMatrix& i
nv, | 204 const SkMatrix& i
nv, |
203 SkFilterQuality q
ual) { | 205 SkFilterQuality q
ual, |
| 206 SkSourceGammaTrea
tment treatment) { |
204 fInvMatrix = inv; | 207 fInvMatrix = inv; |
205 fQuality = qual; | 208 fQuality = qual; |
| 209 fSrcGammaTreatment = treatment; |
206 | 210 |
207 if (this->processHQRequest(provider) || this->processMediumRequest(provider)
) { | 211 if (this->processHQRequest(provider) || this->processMediumRequest(provider)
) { |
208 SkASSERT(fResultBitmap.getPixels()); | 212 SkASSERT(fResultBitmap.getPixels()); |
209 } else { | 213 } else { |
210 (void)provider.asBitmap(&fResultBitmap); | 214 (void)provider.asBitmap(&fResultBitmap); |
211 fResultBitmap.lockPixels(); | 215 fResultBitmap.lockPixels(); |
212 // lock may fail to give us pixels | 216 // lock may fail to give us pixels |
213 } | 217 } |
214 SkASSERT(fQuality <= kLow_SkFilterQuality); | 218 SkASSERT(fQuality <= kLow_SkFilterQuality); |
215 | 219 |
216 // fResultBitmap.getPixels() may be null, but our caller knows to check fPix
map.addr() | 220 // fResultBitmap.getPixels() may be null, but our caller knows to check fPix
map.addr() |
217 // and will destroy us if it is nullptr. | 221 // and will destroy us if it is nullptr. |
218 fPixmap.reset(fResultBitmap.info(), fResultBitmap.getPixels(), fResultBitmap
.rowBytes(), | 222 fPixmap.reset(fResultBitmap.info(), fResultBitmap.getPixels(), fResultBitmap
.rowBytes(), |
219 fResultBitmap.getColorTable()); | 223 fResultBitmap.getColorTable()); |
220 } | 224 } |
221 | 225 |
222 SkBitmapController::State* SkDefaultBitmapController::onRequestBitmap(const SkBi
tmapProvider& bm, | 226 SkBitmapController::State* SkDefaultBitmapController::onRequestBitmap(const SkBi
tmapProvider& bm, |
223 const SkMa
trix& inverse, | 227 const SkMa
trix& inverse, |
224 SkFilterQu
ality quality, | 228 SkFilterQu
ality quality, |
225 void* stor
age, size_t size) { | 229 void* stor
age, size_t size) { |
226 return SkInPlaceNewCheck<SkDefaultBitmapControllerState>(storage, size, bm,
inverse, quality); | 230 return SkInPlaceNewCheck<SkDefaultBitmapControllerState>(storage, size, bm,
inverse, quality, |
| 231 fSrcGammaTreatment)
; |
227 } | 232 } |
OLD | NEW |