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" |
11 #include "SkPaint.h" | 11 #include "SkPaint.h" |
12 #include "SkShader.h" // for tilemodes | 12 #include "SkShader.h" // for tilemodes |
13 #include "SkUtilsArm.h" | 13 #include "SkUtilsArm.h" |
14 #include "SkBitmapScaler.h" | 14 #include "SkBitmapScaler.h" |
15 #include "SkMipMap.h" | 15 #include "SkMipMap.h" |
16 #include "SkPixelRef.h" | 16 #include "SkPixelRef.h" |
17 #include "SkScaledImageCache.h" | 17 #include "SkScaledImageCache.h" |
| 18 #include "SkImageEncoder.h" |
18 | 19 |
19 #if !SK_ARM_NEON_IS_NONE | 20 #if !SK_ARM_NEON_IS_NONE |
20 // These are defined in src/opts/SkBitmapProcState_arm_neon.cpp | 21 // These are defined in src/opts/SkBitmapProcState_arm_neon.cpp |
21 extern const SkBitmapProcState::SampleProc16 gSkBitmapProcStateSample16_neon[]; | 22 extern const SkBitmapProcState::SampleProc16 gSkBitmapProcStateSample16_neon[]; |
22 extern const SkBitmapProcState::SampleProc32 gSkBitmapProcStateSample32_neon[]; | 23 extern const SkBitmapProcState::SampleProc32 gSkBitmapProcStateSample32_neon[]; |
23 extern void S16_D16_filter_DX_neon(const SkBitmapProcState&, const uint32_t*, i
nt, uint16_t*); | 24 extern void S16_D16_filter_DX_neon(const SkBitmapProcState&, const uint32_t*, i
nt, uint16_t*); |
24 extern void Clamp_S16_D16_filter_DX_shaderproc_neon(const SkBitmapProcState&, i
nt, int, uint16_t*, int); | 25 extern void Clamp_S16_D16_filter_DX_shaderproc_neon(const SkBitmapProcState&, i
nt, int, uint16_t*, int); |
25 extern void Repeat_S16_D16_filter_DX_shaderproc_neon(const SkBitmapProcState&,
int, int, uint16_t*, int); | 26 extern void Repeat_S16_D16_filter_DX_shaderproc_neon(const SkBitmapProcState&,
int, int, uint16_t*, int); |
26 extern void SI8_opaque_D32_filter_DX_neon(const SkBitmapProcState&, const uint3
2_t*, int, SkPMColor*); | 27 extern void SI8_opaque_D32_filter_DX_neon(const SkBitmapProcState&, const uint3
2_t*, int, SkPMColor*); |
27 extern void SI8_opaque_D32_filter_DX_shaderproc_neon(const SkBitmapProcState&,
int, int, uint32_t*, int); | 28 extern void SI8_opaque_D32_filter_DX_shaderproc_neon(const SkBitmapProcState&,
int, int, uint32_t*, int); |
(...skipping 131 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
159 if (!fScaledBitmap.getPixels()) { | 160 if (!fScaledBitmap.getPixels()) { |
160 fScaledBitmap.unlockPixels(); | 161 fScaledBitmap.unlockPixels(); |
161 // found a purged entry (discardablememory?), release it | 162 // found a purged entry (discardablememory?), release it |
162 SkScaledImageCache::Unlock(fScaledCacheID); | 163 SkScaledImageCache::Unlock(fScaledCacheID); |
163 fScaledCacheID = NULL; | 164 fScaledCacheID = NULL; |
164 // fall through to rebuild | 165 // fall through to rebuild |
165 } | 166 } |
166 } | 167 } |
167 | 168 |
168 if (NULL == fScaledCacheID) { | 169 if (NULL == fScaledCacheID) { |
169 int dest_width = SkScalarCeilToInt(fOrigBitmap.width() / invScaleX)
; | 170 float dest_width = fOrigBitmap.width() / invScaleX; |
170 int dest_height = SkScalarCeilToInt(fOrigBitmap.height() / invScaleY
); | 171 float dest_height = fOrigBitmap.height() / invScaleY; |
| 172 |
| 173 #ifdef SK_IGNORE_CORRECT_HIGH_QUALITY_IMAGE_SCALE |
| 174 dest_width = SkScalarCeilToScalar(dest_width); |
| 175 dest_height = SkScalarCeilToScalar(dest_height); |
| 176 #endif |
171 | 177 |
172 // All the criteria are met; let's make a new bitmap. | 178 // All the criteria are met; let's make a new bitmap. |
173 | 179 |
174 SkConvolutionProcs simd; | 180 SkConvolutionProcs simd; |
175 sk_bzero(&simd, sizeof(simd)); | 181 sk_bzero(&simd, sizeof(simd)); |
176 this->platformConvolutionProcs(&simd); | 182 this->platformConvolutionProcs(&simd); |
177 | 183 |
178 if (!SkBitmapScaler::Resize(&fScaledBitmap, | 184 if (!SkBitmapScaler::Resize(&fScaledBitmap, |
179 fOrigBitmap, | 185 fOrigBitmap, |
180 SkBitmapScaler::RESIZE_BEST, | 186 SkBitmapScaler::RESIZE_BEST, |
181 dest_width, | 187 dest_width, |
182 dest_height, | 188 dest_height, |
183 simd, | 189 simd, |
184 SkScaledImageCache::GetAllocator())) { | 190 SkScaledImageCache::GetAllocator())) { |
185 // we failed to create fScaledBitmap, so just return and let | 191 // we failed to create fScaledBitmap, so just return and let |
186 // the scanline proc handle it. | 192 // the scanline proc handle it. |
187 return false; | 193 return false; |
188 | 194 |
189 } | 195 } |
| 196 |
190 SkASSERT(NULL != fScaledBitmap.getPixels()); | 197 SkASSERT(NULL != fScaledBitmap.getPixels()); |
191 fScaledCacheID = SkScaledImageCache::AddAndLock(fOrigBitmap, | 198 fScaledCacheID = SkScaledImageCache::AddAndLock(fOrigBitmap, |
192 invScaleX, | 199 invScaleX, |
193 invScaleY, | 200 invScaleY, |
194 fScaledBitmap); | 201 fScaledBitmap); |
195 if (!fScaledCacheID) { | 202 if (!fScaledCacheID) { |
196 fScaledBitmap.reset(); | 203 fScaledBitmap.reset(); |
197 return false; | 204 return false; |
198 } | 205 } |
199 SkASSERT(NULL != fScaledBitmap.getPixels()); | 206 SkASSERT(NULL != fScaledBitmap.getPixels()); |
(...skipping 832 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1032 } else { | 1039 } else { |
1033 size >>= 2; | 1040 size >>= 2; |
1034 } | 1041 } |
1035 | 1042 |
1036 if (fFilterLevel != SkPaint::kNone_FilterLevel) { | 1043 if (fFilterLevel != SkPaint::kNone_FilterLevel) { |
1037 size >>= 1; | 1044 size >>= 1; |
1038 } | 1045 } |
1039 | 1046 |
1040 return size; | 1047 return size; |
1041 } | 1048 } |
OLD | NEW |