| 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 #include "SkImageDecoder.h" | 8 #include "SkImageDecoder.h" |
| 9 #include "SkImageEncoder.h" | 9 #include "SkImageEncoder.h" |
| 10 #include "SkColor.h" | 10 #include "SkColor.h" |
| (...skipping 395 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 406 } else if (hasAlpha) { | 406 } else if (hasAlpha) { |
| 407 sc = SkScaledBitmapSampler::kRGBA; | 407 sc = SkScaledBitmapSampler::kRGBA; |
| 408 } else { | 408 } else { |
| 409 sc = SkScaledBitmapSampler::kRGBX; | 409 sc = SkScaledBitmapSampler::kRGBX; |
| 410 } | 410 } |
| 411 | 411 |
| 412 /* We have to pass the colortable explicitly, since we may have one | 412 /* We have to pass the colortable explicitly, since we may have one |
| 413 even if our decodedBitmap doesn't, due to the request that we | 413 even if our decodedBitmap doesn't, due to the request that we |
| 414 upscale png's palette to a direct model | 414 upscale png's palette to a direct model |
| 415 */ | 415 */ |
| 416 SkAutoLockColors ctLock(colorTable); | 416 const SkPMColor* colors = colorTable ? colorTable->readColors() : NULL; |
| 417 if (!sampler.begin(decodedBitmap, sc, *this, ctLock.colors())) { | 417 if (!sampler.begin(decodedBitmap, sc, *this, colors)) { |
| 418 return kFailure; | 418 return kFailure; |
| 419 } | 419 } |
| 420 const int height = decodedBitmap->height(); | 420 const int height = decodedBitmap->height(); |
| 421 | 421 |
| 422 if (number_passes > 1) { | 422 if (number_passes > 1) { |
| 423 SkAutoMalloc storage(origWidth * origHeight * srcBytesPerPixel); | 423 SkAutoMalloc storage(origWidth * origHeight * srcBytesPerPixel); |
| 424 uint8_t* base = (uint8_t*)storage.get(); | 424 uint8_t* base = (uint8_t*)storage.get(); |
| 425 size_t rowBytes = origWidth * srcBytesPerPixel; | 425 size_t rowBytes = origWidth * srcBytesPerPixel; |
| 426 | 426 |
| 427 for (int i = 0; i < number_passes; i++) { | 427 for (int i = 0; i < number_passes; i++) { |
| (...skipping 459 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 887 } else if (hasAlpha) { | 887 } else if (hasAlpha) { |
| 888 sc = SkScaledBitmapSampler::kRGBA; | 888 sc = SkScaledBitmapSampler::kRGBA; |
| 889 } else { | 889 } else { |
| 890 sc = SkScaledBitmapSampler::kRGBX; | 890 sc = SkScaledBitmapSampler::kRGBX; |
| 891 } | 891 } |
| 892 | 892 |
| 893 /* We have to pass the colortable explicitly, since we may have one | 893 /* We have to pass the colortable explicitly, since we may have one |
| 894 even if our decodedBitmap doesn't, due to the request that we | 894 even if our decodedBitmap doesn't, due to the request that we |
| 895 upscale png's palette to a direct model | 895 upscale png's palette to a direct model |
| 896 */ | 896 */ |
| 897 SkAutoLockColors ctLock(colorTable); | 897 const SkPMColor* colors = colorTable ? colorTable->readColors() : NULL; |
| 898 if (!sampler.begin(&decodedBitmap, sc, *this, ctLock.colors())) { | 898 if (!sampler.begin(&decodedBitmap, sc, *this, colors)) { |
| 899 return false; | 899 return false; |
| 900 } | 900 } |
| 901 const int height = decodedBitmap.height(); | 901 const int height = decodedBitmap.height(); |
| 902 | 902 |
| 903 if (number_passes > 1) { | 903 if (number_passes > 1) { |
| 904 SkAutoMalloc storage(origWidth * origHeight * srcBytesPerPixel); | 904 SkAutoMalloc storage(origWidth * origHeight * srcBytesPerPixel); |
| 905 uint8_t* base = (uint8_t*)storage.get(); | 905 uint8_t* base = (uint8_t*)storage.get(); |
| 906 size_t rb = origWidth * srcBytesPerPixel; | 906 size_t rb = origWidth * srcBytesPerPixel; |
| 907 | 907 |
| 908 for (int i = 0; i < number_passes; i++) { | 908 for (int i = 0; i < number_passes; i++) { |
| (...skipping 131 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1040 /* Pack palette[] with the corresponding colors, and if hasAlpha is true, also | 1040 /* Pack palette[] with the corresponding colors, and if hasAlpha is true, also |
| 1041 pack trans[] and return the number of trans[] entries written. If hasAlpha | 1041 pack trans[] and return the number of trans[] entries written. If hasAlpha |
| 1042 is false, the return value will always be 0. | 1042 is false, the return value will always be 0. |
| 1043 | 1043 |
| 1044 Note: this routine takes care of unpremultiplying the RGB values when we | 1044 Note: this routine takes care of unpremultiplying the RGB values when we |
| 1045 have alpha in the colortable, since png doesn't support premul colors | 1045 have alpha in the colortable, since png doesn't support premul colors |
| 1046 */ | 1046 */ |
| 1047 static inline int pack_palette(SkColorTable* ctable, | 1047 static inline int pack_palette(SkColorTable* ctable, |
| 1048 png_color* SK_RESTRICT palette, | 1048 png_color* SK_RESTRICT palette, |
| 1049 png_byte* SK_RESTRICT trans, bool hasAlpha) { | 1049 png_byte* SK_RESTRICT trans, bool hasAlpha) { |
| 1050 SkAutoLockColors alc(ctable); | 1050 const SkPMColor* SK_RESTRICT colors = ctable ? ctable->readColors() : NULL; |
| 1051 const SkPMColor* SK_RESTRICT colors = alc.colors(); | |
| 1052 const int ctCount = ctable->count(); | 1051 const int ctCount = ctable->count(); |
| 1053 int i, num_trans = 0; | 1052 int i, num_trans = 0; |
| 1054 | 1053 |
| 1055 if (hasAlpha) { | 1054 if (hasAlpha) { |
| 1056 /* first see if we have some number of fully opaque at the end of the | 1055 /* first see if we have some number of fully opaque at the end of the |
| 1057 ctable. PNG allows num_trans < num_palette, but all of the trans | 1056 ctable. PNG allows num_trans < num_palette, but all of the trans |
| 1058 entries must come first in the palette. If I was smarter, I'd | 1057 entries must come first in the palette. If I was smarter, I'd |
| 1059 reorder the indices and ctable so that all non-opaque colors came | 1058 reorder the indices and ctable so that all non-opaque colors came |
| 1060 first in the palette. But, since that would slow down the encode, | 1059 first in the palette. But, since that would slow down the encode, |
| 1061 I'm leaving the indices and ctable order as is, and just looking | 1060 I'm leaving the indices and ctable order as is, and just looking |
| (...skipping 214 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1276 return SkImageDecoder::kUnknown_Format; | 1275 return SkImageDecoder::kUnknown_Format; |
| 1277 } | 1276 } |
| 1278 | 1277 |
| 1279 SkImageEncoder* sk_libpng_efactory(SkImageEncoder::Type t) { | 1278 SkImageEncoder* sk_libpng_efactory(SkImageEncoder::Type t) { |
| 1280 return (SkImageEncoder::kPNG_Type == t) ? SkNEW(SkPNGImageEncoder) : NULL; | 1279 return (SkImageEncoder::kPNG_Type == t) ? SkNEW(SkPNGImageEncoder) : NULL; |
| 1281 } | 1280 } |
| 1282 | 1281 |
| 1283 static SkImageDecoder_DecodeReg gDReg(sk_libpng_dfactory); | 1282 static SkImageDecoder_DecodeReg gDReg(sk_libpng_dfactory); |
| 1284 static SkImageDecoder_FormatReg gFormatReg(get_format_png); | 1283 static SkImageDecoder_FormatReg gFormatReg(get_format_png); |
| 1285 static SkImageEncoder_EncodeReg gEReg(sk_libpng_efactory); | 1284 static SkImageEncoder_EncodeReg gEReg(sk_libpng_efactory); |
| OLD | NEW |