OLD | NEW |
1 /* | 1 /* |
2 * Copyright 2010 The Android Open Source Project | 2 * Copyright 2010 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 #include "SkPDFImage.h" | 8 #include "SkPDFImage.h" |
9 | 9 |
10 #include "SkBitmap.h" | 10 #include "SkBitmap.h" |
(...skipping 221 matching lines...) Loading... |
232 const SkIRect& srcRect, | 232 const SkIRect& srcRect, |
233 bool extractAlpha, bool* isTransparent) { | 233 bool extractAlpha, bool* isTransparent) { |
234 SkColorType colorType = bitmap.colorType(); | 234 SkColorType colorType = bitmap.colorType(); |
235 if (extractAlpha && (kIndex_8_SkColorType == colorType || | 235 if (extractAlpha && (kIndex_8_SkColorType == colorType || |
236 kRGB_565_SkColorType == colorType)) { | 236 kRGB_565_SkColorType == colorType)) { |
237 if (isTransparent != NULL) { | 237 if (isTransparent != NULL) { |
238 *isTransparent = false; | 238 *isTransparent = false; |
239 } | 239 } |
240 return NULL; | 240 return NULL; |
241 } | 241 } |
242 bool isOpaque = true; | |
243 bool transparent = extractAlpha; | |
244 SkStream* stream = NULL; | |
245 | 242 |
246 SkAutoLockPixels lock(bitmap); | 243 SkAutoLockPixels lock(bitmap); |
247 if (NULL == bitmap.getPixels()) { | 244 if (NULL == bitmap.getPixels()) { |
248 return NULL; | 245 return NULL; |
249 } | 246 } |
250 | 247 |
| 248 bool isOpaque = true; |
| 249 bool transparent = extractAlpha; |
| 250 SkAutoTDelete<SkStream> stream; |
| 251 |
251 switch (colorType) { | 252 switch (colorType) { |
252 case kIndex_8_SkColorType: | 253 case kIndex_8_SkColorType: |
253 if (!extractAlpha) { | 254 if (!extractAlpha) { |
254 stream = extract_index8_image(bitmap, srcRect); | 255 stream.reset(extract_index8_image(bitmap, srcRect)); |
255 } | 256 } |
256 break; | 257 break; |
257 case kARGB_4444_SkColorType: | 258 case kARGB_4444_SkColorType: |
258 stream = extract_argb4444_data(bitmap, srcRect, extractAlpha, | 259 stream.reset(extract_argb4444_data(bitmap, srcRect, extractAlpha, |
259 &isOpaque, &transparent); | 260 &isOpaque, &transparent)); |
260 break; | 261 break; |
261 case kRGB_565_SkColorType: | 262 case kRGB_565_SkColorType: |
262 if (!extractAlpha) { | 263 if (!extractAlpha) { |
263 stream = extract_rgb565_image(bitmap, srcRect); | 264 stream.reset(extract_rgb565_image(bitmap, srcRect)); |
264 } | 265 } |
265 break; | 266 break; |
266 case kN32_SkColorType: | 267 case kN32_SkColorType: |
267 stream = extract_argb8888_data(bitmap, srcRect, extractAlpha, | 268 stream.reset(extract_argb8888_data(bitmap, srcRect, extractAlpha, |
268 &isOpaque, &transparent); | 269 &isOpaque, &transparent)); |
269 break; | 270 break; |
270 case kAlpha_8_SkColorType: | 271 case kAlpha_8_SkColorType: |
271 if (!extractAlpha) { | 272 if (!extractAlpha) { |
272 stream = create_black_image(); | 273 stream.reset(create_black_image()); |
273 } else { | 274 } else { |
274 stream = extract_a8_alpha(bitmap, srcRect, | 275 stream.reset(extract_a8_alpha(bitmap, srcRect, |
275 &isOpaque, &transparent); | 276 &isOpaque, &transparent)); |
276 } | 277 } |
277 break; | 278 break; |
278 default: | 279 default: |
279 SkASSERT(false); | 280 SkASSERT(false); |
280 } | 281 } |
281 | 282 |
282 if (isTransparent != NULL) { | 283 if (isTransparent != NULL) { |
283 *isTransparent = transparent; | 284 *isTransparent = transparent; |
284 } | 285 } |
285 if (extractAlpha && (transparent || isOpaque)) { | 286 if (extractAlpha && (transparent || isOpaque)) { |
286 SkSafeUnref(stream); | |
287 return NULL; | 287 return NULL; |
288 } | 288 } |
289 return stream; | 289 return stream.detach(); |
290 } | 290 } |
291 | 291 |
292 static SkPDFArray* make_indexed_color_space(SkColorTable* table) { | 292 static SkPDFArray* make_indexed_color_space(SkColorTable* table) { |
293 SkPDFArray* result = new SkPDFArray(); | 293 SkPDFArray* result = new SkPDFArray(); |
294 result->reserve(4); | 294 result->reserve(4); |
295 result->appendName("Indexed"); | 295 result->appendName("Indexed"); |
296 result->appendName("DeviceRGB"); | 296 result->appendName("DeviceRGB"); |
297 result->appendInt(table->count() - 1); | 297 result->appendInt(table->count() - 1); |
298 | 298 |
299 // Potentially, this could be represented in fewer bytes with a stream. | 299 // Potentially, this could be represented in fewer bytes with a stream. |
(...skipping 161 matching lines...) Loading... |
461 | 461 |
462 // static | 462 // static |
463 SkPDFImage* SkPDFImage::CreateImage(const SkBitmap& bitmap, | 463 SkPDFImage* SkPDFImage::CreateImage(const SkBitmap& bitmap, |
464 const SkIRect& srcRect, | 464 const SkIRect& srcRect, |
465 SkPicture::EncodeBitmap encoder) { | 465 SkPicture::EncodeBitmap encoder) { |
466 if (bitmap.colorType() == kUnknown_SkColorType) { | 466 if (bitmap.colorType() == kUnknown_SkColorType) { |
467 return NULL; | 467 return NULL; |
468 } | 468 } |
469 | 469 |
470 bool isTransparent = false; | 470 bool isTransparent = false; |
471 SkAutoTUnref<SkStream> alphaData; | 471 SkAutoTDelete<SkStream> alphaData; |
472 if (!bitmap.isOpaque()) { | 472 if (!bitmap.isOpaque()) { |
473 // Note that isOpaque is not guaranteed to return false for bitmaps | 473 // Note that isOpaque is not guaranteed to return false for bitmaps |
474 // with alpha support but a completely opaque alpha channel, | 474 // with alpha support but a completely opaque alpha channel, |
475 // so alphaData may still be NULL if we have a completely opaque | 475 // so alphaData may still be NULL if we have a completely opaque |
476 // (or transparent) bitmap. | 476 // (or transparent) bitmap. |
477 alphaData.reset( | 477 alphaData.reset( |
478 extract_image_data(bitmap, srcRect, true, &isTransparent)); | 478 extract_image_data(bitmap, srcRect, true, &isTransparent)); |
479 } | 479 } |
480 if (isTransparent) { | 480 if (isTransparent) { |
481 return NULL; | 481 return NULL; |
(...skipping 150 matching lines...) Loading... |
632 | 632 |
633 insertName("Filter", "DCTDecode"); | 633 insertName("Filter", "DCTDecode"); |
634 insertInt("ColorTransform", kNoColorTransform); | 634 insertInt("ColorTransform", kNoColorTransform); |
635 insertInt("Length", this->dataSize()); | 635 insertInt("Length", this->dataSize()); |
636 setState(kCompressed_State); | 636 setState(kCompressed_State); |
637 return true; | 637 return true; |
638 } | 638 } |
639 } | 639 } |
640 // Fallback method | 640 // Fallback method |
641 if (!fStreamValid) { | 641 if (!fStreamValid) { |
642 SkAutoTUnref<SkStream> stream( | 642 SkAutoTDelete<SkStream> stream( |
643 extract_image_data(fBitmap, fSrcRect, fIsAlpha, NULL)); | 643 extract_image_data(fBitmap, fSrcRect, fIsAlpha, NULL)); |
644 this->setData(stream); | 644 this->setData(stream); |
645 fStreamValid = true; | 645 fStreamValid = true; |
646 } | 646 } |
647 return INHERITED::populate(catalog); | 647 return INHERITED::populate(catalog); |
648 } else if (getState() == kNoCompression_State && | 648 } else if (getState() == kNoCompression_State && |
649 !skip_compression(catalog) && | 649 !skip_compression(catalog) && |
650 (SkFlate::HaveFlate() || fEncoder)) { | 650 (SkFlate::HaveFlate() || fEncoder)) { |
651 // Compression has not been requested when the stream was first created, | 651 // Compression has not been requested when the stream was first created, |
652 // but the new catalog wants it compressed. | 652 // but the new catalog wants it compressed. |
(...skipping 91 matching lines...) Loading... |
744 if (SkIRect::MakeWH(bitmap.width(), bitmap.height()) == subset) { | 744 if (SkIRect::MakeWH(bitmap.width(), bitmap.height()) == subset) { |
745 SkAutoTUnref<SkData> encodedData(ref_encoded_data(bitmap)); | 745 SkAutoTUnref<SkData> encodedData(ref_encoded_data(bitmap)); |
746 if (is_jfif_jpeg(encodedData)) { | 746 if (is_jfif_jpeg(encodedData)) { |
747 return SkNEW_ARGS(PDFJPEGImage, | 747 return SkNEW_ARGS(PDFJPEGImage, |
748 (encodedData, bitmap.width(), bitmap.height())); | 748 (encodedData, bitmap.width(), bitmap.height())); |
749 } | 749 } |
750 } | 750 } |
751 #endif | 751 #endif |
752 return SkPDFImage::CreateImage(bitmap, subset, encoder); | 752 return SkPDFImage::CreateImage(bitmap, subset, encoder); |
753 } | 753 } |
OLD | NEW |