OLD | NEW |
1 /* | 1 /* |
2 * Copyright 2006 The Android Open Source Project | 2 * Copyright 2006 The Android Open Source Project |
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 | 8 |
9 #include "SkImageDecoder.h" | 9 #include "SkImageDecoder.h" |
10 #include "SkBitmap.h" | 10 #include "SkBitmap.h" |
(...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
117 return alloc; | 117 return alloc; |
118 } | 118 } |
119 | 119 |
120 void SkImageDecoder::setSampleSize(int size) { | 120 void SkImageDecoder::setSampleSize(int size) { |
121 if (size < 1) { | 121 if (size < 1) { |
122 size = 1; | 122 size = 1; |
123 } | 123 } |
124 fSampleSize = size; | 124 fSampleSize = size; |
125 } | 125 } |
126 | 126 |
127 bool SkImageDecoder::chooseFromOneChoice(SkBitmap::Config config, int width, | 127 // TODO: change Chooser virtual to take colorType, so we can stop calling SkColo
rTypeToBitmapConfig |
128 int height) const { | 128 // |
| 129 bool SkImageDecoder::chooseFromOneChoice(SkColorType colorType, int width, int h
eight) const { |
129 Chooser* chooser = fChooser; | 130 Chooser* chooser = fChooser; |
130 | 131 |
131 if (NULL == chooser) { // no chooser, we just say YES to decoding :) | 132 if (NULL == chooser) { // no chooser, we just say YES to decoding :) |
132 return true; | 133 return true; |
133 } | 134 } |
134 chooser->begin(1); | 135 chooser->begin(1); |
135 chooser->inspect(0, config, width, height); | 136 chooser->inspect(0, SkColorTypeToBitmapConfig(colorType), width, height); |
136 return chooser->choose() == 0; | 137 return chooser->choose() == 0; |
137 } | 138 } |
138 | 139 |
139 bool SkImageDecoder::allocPixelRef(SkBitmap* bitmap, | 140 bool SkImageDecoder::allocPixelRef(SkBitmap* bitmap, |
140 SkColorTable* ctable) const { | 141 SkColorTable* ctable) const { |
141 return bitmap->allocPixels(fAllocator, ctable); | 142 return bitmap->allocPixels(fAllocator, ctable); |
142 } | 143 } |
143 | 144 |
144 /////////////////////////////////////////////////////////////////////////////// | 145 /////////////////////////////////////////////////////////////////////////////// |
145 | 146 |
146 void SkImageDecoder::setPrefConfigTable(const PrefConfigTable& prefTable) { | 147 void SkImageDecoder::setPrefConfigTable(const PrefConfigTable& prefTable) { |
147 fUsePrefTable = true; | 148 fUsePrefTable = true; |
148 fPrefTable = prefTable; | 149 fPrefTable = prefTable; |
149 } | 150 } |
150 | 151 |
151 SkBitmap::Config SkImageDecoder::getPrefConfig(SrcDepth srcDepth, | 152 // TODO: use colortype in fPrefTable, fDefaultPref and GetDeviceConfig() |
152 bool srcHasAlpha) const { | 153 // so we can stop using SkBitmapConfigToColorType() |
| 154 // |
| 155 SkColorType SkImageDecoder::getPrefColorType(SrcDepth srcDepth, bool srcHasAlpha
) const { |
153 SkBitmap::Config config = SkBitmap::kNo_Config; | 156 SkBitmap::Config config = SkBitmap::kNo_Config; |
154 | 157 |
155 if (fUsePrefTable) { | 158 if (fUsePrefTable) { |
156 switch (srcDepth) { | 159 switch (srcDepth) { |
157 case kIndex_SrcDepth: | 160 case kIndex_SrcDepth: |
158 config = srcHasAlpha ? fPrefTable.fPrefFor_8Index_YesAlpha_src | 161 config = srcHasAlpha ? fPrefTable.fPrefFor_8Index_YesAlpha_src |
159 : fPrefTable.fPrefFor_8Index_NoAlpha_src; | 162 : fPrefTable.fPrefFor_8Index_NoAlpha_src; |
160 break; | 163 break; |
161 case k8BitGray_SrcDepth: | 164 case k8BitGray_SrcDepth: |
162 config = fPrefTable.fPrefFor_8Gray_src; | 165 config = fPrefTable.fPrefFor_8Gray_src; |
163 break; | 166 break; |
164 case k32Bit_SrcDepth: | 167 case k32Bit_SrcDepth: |
165 config = srcHasAlpha ? fPrefTable.fPrefFor_8bpc_YesAlpha_src | 168 config = srcHasAlpha ? fPrefTable.fPrefFor_8bpc_YesAlpha_src |
166 : fPrefTable.fPrefFor_8bpc_NoAlpha_src; | 169 : fPrefTable.fPrefFor_8bpc_NoAlpha_src; |
167 break; | 170 break; |
168 } | 171 } |
169 } else { | 172 } else { |
170 config = fDefaultPref; | 173 config = fDefaultPref; |
171 } | 174 } |
172 | 175 |
173 if (SkBitmap::kNo_Config == config) { | 176 if (SkBitmap::kNo_Config == config) { |
174 config = SkImageDecoder::GetDeviceConfig(); | 177 config = SkImageDecoder::GetDeviceConfig(); |
175 } | 178 } |
176 return config; | 179 return SkBitmapConfigToColorType(config); |
177 } | 180 } |
178 | 181 |
179 bool SkImageDecoder::decode(SkStream* stream, SkBitmap* bm, | 182 bool SkImageDecoder::decode(SkStream* stream, SkBitmap* bm, |
180 SkBitmap::Config pref, Mode mode) { | 183 SkBitmap::Config pref, Mode mode) { |
181 // we reset this to false before calling onDecode | 184 // we reset this to false before calling onDecode |
182 fShouldCancelDecode = false; | 185 fShouldCancelDecode = false; |
183 // assign this, for use by getPrefConfig(), in case fUsePrefTable is false | 186 // assign this, for use by getPrefConfig(), in case fUsePrefTable is false |
184 fDefaultPref = pref; | 187 fDefaultPref = pref; |
185 | 188 |
186 // pass a temporary bitmap, so that if we return false, we are assured of | 189 // pass a temporary bitmap, so that if we return false, we are assured of |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
225 // savings are more important than speed here. This also means | 228 // savings are more important than speed here. This also means |
226 // that the pixels in dst can not be reused (though there is no | 229 // that the pixels in dst can not be reused (though there is no |
227 // allocation, which was already done on src). | 230 // allocation, which was already done on src). |
228 int x = (dstX - srcX) / sampleSize; | 231 int x = (dstX - srcX) / sampleSize; |
229 int y = (dstY - srcY) / sampleSize; | 232 int y = (dstY - srcY) / sampleSize; |
230 SkIRect subset = SkIRect::MakeXYWH(x, y, w, h); | 233 SkIRect subset = SkIRect::MakeXYWH(x, y, w, h); |
231 return src->extractSubset(dst, subset); | 234 return src->extractSubset(dst, subset); |
232 } | 235 } |
233 // if the destination has no pixels then we must allocate them. | 236 // if the destination has no pixels then we must allocate them. |
234 if (dst->isNull()) { | 237 if (dst->isNull()) { |
235 dst->setConfig(src->config(), w, h, 0, src->alphaType()); | 238 dst->setInfo(src->info().makeWH(w, h)); |
236 | 239 |
237 if (!this->allocPixelRef(dst, NULL)) { | 240 if (!this->allocPixelRef(dst, NULL)) { |
238 SkDEBUGF(("failed to allocate pixels needed to crop the bitmap")); | 241 SkDEBUGF(("failed to allocate pixels needed to crop the bitmap")); |
239 return false; | 242 return false; |
240 } | 243 } |
241 } | 244 } |
242 // check to see if the destination is large enough to decode the desired | 245 // check to see if the destination is large enough to decode the desired |
243 // region. If this assert fails we will just draw as much of the source | 246 // region. If this assert fails we will just draw as much of the source |
244 // into the destination that we can. | 247 // into the destination that we can. |
245 if (dst->width() < w || dst->height() < h) { | 248 if (dst->width() < w || dst->height() < h) { |
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
302 if (kUnknown_Format == *format) { | 305 if (kUnknown_Format == *format) { |
303 if (stream->rewind()) { | 306 if (stream->rewind()) { |
304 *format = GetStreamFormat(stream); | 307 *format = GetStreamFormat(stream); |
305 } | 308 } |
306 } | 309 } |
307 } | 310 } |
308 delete codec; | 311 delete codec; |
309 } | 312 } |
310 return success; | 313 return success; |
311 } | 314 } |
OLD | NEW |