| 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 809 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 820 bool onEncode(SkWStream* stream, const SkBitmap& bm, int quality) override; | 820 bool onEncode(SkWStream* stream, const SkBitmap& bm, int quality) override; |
| 821 private: | 821 private: |
| 822 bool doEncode(SkWStream* stream, const SkBitmap& bm, | 822 bool doEncode(SkWStream* stream, const SkBitmap& bm, |
| 823 const bool& hasAlpha, int colorType, | 823 const bool& hasAlpha, int colorType, |
| 824 int bitDepth, SkColorType ct, | 824 int bitDepth, SkColorType ct, |
| 825 png_color_8& sig_bit); | 825 png_color_8& sig_bit); |
| 826 | 826 |
| 827 typedef SkImageEncoder INHERITED; | 827 typedef SkImageEncoder INHERITED; |
| 828 }; | 828 }; |
| 829 | 829 |
| 830 bool SkPNGImageEncoder::onEncode(SkWStream* stream, const SkBitmap& bitmap, int
/*quality*/) { | 830 bool SkPNGImageEncoder::onEncode(SkWStream* stream, |
| 831 SkColorType ct = bitmap.colorType(); | 831 const SkBitmap& originalBitmap, |
| 832 int /*quality*/) { |
| 833 SkBitmap copy; |
| 834 const SkBitmap* bitmap = &originalBitmap; |
| 835 switch (originalBitmap.colorType()) { |
| 836 case kIndex_8_SkColorType: |
| 837 case kN32_SkColorType: |
| 838 case kARGB_4444_SkColorType: |
| 839 case kRGB_565_SkColorType: |
| 840 break; |
| 841 default: |
| 842 // TODO(scroggo): support 8888-but-not-N32 natively. |
| 843 // TODO(scroggo): support kGray_8 directly. |
| 844 // TODO(scroggo): support Alpha_8 as Grayscale(black)+Alpha |
| 845 if (originalBitmap.copyTo(©, kN32_SkColorType)) { |
| 846 bitmap = © |
| 847 } |
| 848 } |
| 849 SkColorType ct = bitmap->colorType(); |
| 832 | 850 |
| 833 const bool hasAlpha = !bitmap.isOpaque(); | 851 const bool hasAlpha = !bitmap->isOpaque(); |
| 834 int colorType = PNG_COLOR_MASK_COLOR; | 852 int colorType = PNG_COLOR_MASK_COLOR; |
| 835 int bitDepth = 8; // default for color | 853 int bitDepth = 8; // default for color |
| 836 png_color_8 sig_bit; | 854 png_color_8 sig_bit; |
| 837 | 855 |
| 838 switch (ct) { | 856 switch (ct) { |
| 839 case kIndex_8_SkColorType: | 857 case kIndex_8_SkColorType: |
| 840 colorType |= PNG_COLOR_MASK_PALETTE; | 858 colorType |= PNG_COLOR_MASK_PALETTE; |
| 841 // fall through to the ARGB_8888 case | 859 // fall through to the ARGB_8888 case |
| 842 case kN32_SkColorType: | 860 case kN32_SkColorType: |
| 843 sig_bit.red = 8; | 861 sig_bit.red = 8; |
| (...skipping 19 matching lines...) Expand all Loading... |
| 863 | 881 |
| 864 if (hasAlpha) { | 882 if (hasAlpha) { |
| 865 // don't specify alpha if we're a palette, even if our ctable has alpha | 883 // don't specify alpha if we're a palette, even if our ctable has alpha |
| 866 if (!(colorType & PNG_COLOR_MASK_PALETTE)) { | 884 if (!(colorType & PNG_COLOR_MASK_PALETTE)) { |
| 867 colorType |= PNG_COLOR_MASK_ALPHA; | 885 colorType |= PNG_COLOR_MASK_ALPHA; |
| 868 } | 886 } |
| 869 } else { | 887 } else { |
| 870 sig_bit.alpha = 0; | 888 sig_bit.alpha = 0; |
| 871 } | 889 } |
| 872 | 890 |
| 873 SkAutoLockPixels alp(bitmap); | 891 SkAutoLockPixels alp(*bitmap); |
| 874 // readyToDraw checks for pixels (and colortable if that is required) | 892 // readyToDraw checks for pixels (and colortable if that is required) |
| 875 if (!bitmap.readyToDraw()) { | 893 if (!bitmap->readyToDraw()) { |
| 876 return false; | 894 return false; |
| 877 } | 895 } |
| 878 | 896 |
| 879 // we must do this after we have locked the pixels | 897 // we must do this after we have locked the pixels |
| 880 SkColorTable* ctable = bitmap.getColorTable(); | 898 SkColorTable* ctable = bitmap->getColorTable(); |
| 881 if (ctable) { | 899 if (ctable) { |
| 882 if (ctable->count() == 0) { | 900 if (ctable->count() == 0) { |
| 883 return false; | 901 return false; |
| 884 } | 902 } |
| 885 // check if we can store in fewer than 8 bits | 903 // check if we can store in fewer than 8 bits |
| 886 bitDepth = computeBitDepth(ctable->count()); | 904 bitDepth = computeBitDepth(ctable->count()); |
| 887 } | 905 } |
| 888 | 906 |
| 889 return doEncode(stream, bitmap, hasAlpha, colorType, bitDepth, ct, sig_bit); | 907 return doEncode(stream, *bitmap, hasAlpha, colorType, bitDepth, ct, sig_bit)
; |
| 890 } | 908 } |
| 891 | 909 |
| 892 bool SkPNGImageEncoder::doEncode(SkWStream* stream, const SkBitmap& bitmap, | 910 bool SkPNGImageEncoder::doEncode(SkWStream* stream, const SkBitmap& bitmap, |
| 893 const bool& hasAlpha, int colorType, | 911 const bool& hasAlpha, int colorType, |
| 894 int bitDepth, SkColorType ct, | 912 int bitDepth, SkColorType ct, |
| 895 png_color_8& sig_bit) { | 913 png_color_8& sig_bit) { |
| 896 | 914 |
| 897 png_structp png_ptr; | 915 png_structp png_ptr; |
| 898 png_infop info_ptr; | 916 png_infop info_ptr; |
| 899 | 917 |
| (...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 996 return SkImageDecoder::kUnknown_Format; | 1014 return SkImageDecoder::kUnknown_Format; |
| 997 } | 1015 } |
| 998 | 1016 |
| 999 SkImageEncoder* sk_libpng_efactory(SkImageEncoder::Type t) { | 1017 SkImageEncoder* sk_libpng_efactory(SkImageEncoder::Type t) { |
| 1000 return (SkImageEncoder::kPNG_Type == t) ? new SkPNGImageEncoder : nullptr; | 1018 return (SkImageEncoder::kPNG_Type == t) ? new SkPNGImageEncoder : nullptr; |
| 1001 } | 1019 } |
| 1002 | 1020 |
| 1003 static SkImageDecoder_DecodeReg gDReg(sk_libpng_dfactory); | 1021 static SkImageDecoder_DecodeReg gDReg(sk_libpng_dfactory); |
| 1004 static SkImageDecoder_FormatReg gFormatReg(get_format_png); | 1022 static SkImageDecoder_FormatReg gFormatReg(get_format_png); |
| 1005 static SkImageEncoder_EncodeReg gEReg(sk_libpng_efactory); | 1023 static SkImageEncoder_EncodeReg gEReg(sk_libpng_efactory); |
| OLD | NEW |