OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "ui/gfx/codec/png_codec.h" | 5 #include "ui/gfx/codec/png_codec.h" |
6 | 6 |
7 #include "base/logging.h" | 7 #include "base/logging.h" |
8 #include "base/strings/string_util.h" | 8 #include "base/strings/string_util.h" |
9 #include "third_party/libpng/png.h" | 9 #include "third_party/libpng/png.h" |
10 #include "third_party/skia/include/core/SkBitmap.h" | 10 #include "third_party/skia/include/core/SkBitmap.h" |
(...skipping 19 matching lines...) Expand all Loading... |
30 pixel_out[3] = pixel_in[3]; | 30 pixel_out[3] = pixel_in[3]; |
31 } | 31 } |
32 } | 32 } |
33 | 33 |
34 void ConvertRGBAtoRGB(const unsigned char* rgba, int pixel_width, | 34 void ConvertRGBAtoRGB(const unsigned char* rgba, int pixel_width, |
35 unsigned char* rgb, bool* is_opaque) { | 35 unsigned char* rgb, bool* is_opaque) { |
36 for (int x = 0; x < pixel_width; x++) | 36 for (int x = 0; x < pixel_width; x++) |
37 memcpy(&rgb[x * 3], &rgba[x * 4], 3); | 37 memcpy(&rgb[x * 3], &rgba[x * 4], 3); |
38 } | 38 } |
39 | 39 |
40 void ConvertSkiatoRGB(const unsigned char* skia, int pixel_width, | 40 void ConvertSkiaToRGB(const unsigned char* skia, int pixel_width, |
41 unsigned char* rgb, bool* is_opaque) { | 41 unsigned char* rgb, bool* is_opaque) { |
42 for (int x = 0; x < pixel_width; x++) { | 42 for (int x = 0; x < pixel_width; x++) { |
43 const uint32_t pixel_in = *reinterpret_cast<const uint32_t*>(&skia[x * 4]); | 43 const uint32_t pixel_in = *reinterpret_cast<const uint32_t*>(&skia[x * 4]); |
44 unsigned char* pixel_out = &rgb[x * 3]; | 44 unsigned char* pixel_out = &rgb[x * 3]; |
45 | 45 |
46 int alpha = SkGetPackedA32(pixel_in); | 46 int alpha = SkGetPackedA32(pixel_in); |
47 if (alpha != 0 && alpha != 255) { | 47 if (alpha != 0 && alpha != 255) { |
48 SkColor unmultiplied = SkUnPreMultiply::PMColorToColor(pixel_in); | 48 SkColor unmultiplied = SkUnPreMultiply::PMColorToColor(pixel_in); |
49 pixel_out[0] = SkColorGetR(unmultiplied); | 49 pixel_out[0] = SkColorGetR(unmultiplied); |
50 pixel_out[1] = SkColorGetG(unmultiplied); | 50 pixel_out[1] = SkColorGetG(unmultiplied); |
51 pixel_out[2] = SkColorGetB(unmultiplied); | 51 pixel_out[2] = SkColorGetB(unmultiplied); |
52 } else { | 52 } else { |
53 pixel_out[0] = SkGetPackedR32(pixel_in); | 53 pixel_out[0] = SkGetPackedR32(pixel_in); |
54 pixel_out[1] = SkGetPackedG32(pixel_in); | 54 pixel_out[1] = SkGetPackedG32(pixel_in); |
55 pixel_out[2] = SkGetPackedB32(pixel_in); | 55 pixel_out[2] = SkGetPackedB32(pixel_in); |
56 } | 56 } |
57 } | 57 } |
58 } | 58 } |
59 | 59 |
60 void ConvertSkiatoRGBA(const unsigned char* skia, int pixel_width, | 60 void ConvertSkiaToRGBA(const unsigned char* skia, int pixel_width, |
61 unsigned char* rgba, bool* is_opaque) { | 61 unsigned char* rgba, bool* is_opaque) { |
62 gfx::ConvertSkiaToRGBA(skia, pixel_width, rgba); | 62 gfx::ConvertSkiaToRGBA(skia, pixel_width, rgba); |
63 } | 63 } |
64 | 64 |
65 } // namespace | 65 } // namespace |
66 | 66 |
67 // Decoder -------------------------------------------------------------------- | 67 // Decoder -------------------------------------------------------------------- |
68 // | 68 // |
69 // This code is based on WebKit libpng interface (PNGImageDecoder), which is | 69 // This code is based on WebKit libpng interface (PNGImageDecoder), which is |
70 // in turn based on the Mozilla png decoder. | 70 // in turn based on the Mozilla png decoder. |
(...skipping 610 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
681 // color intensity. | 681 // color intensity. |
682 input_color_components = 1; | 682 input_color_components = 1; |
683 output_color_components = 1; | 683 output_color_components = 1; |
684 png_output_color_type = PNG_COLOR_TYPE_GRAY; | 684 png_output_color_type = PNG_COLOR_TYPE_GRAY; |
685 // |converter| is left as null | 685 // |converter| is left as null |
686 } else { | 686 } else { |
687 input_color_components = 4; | 687 input_color_components = 4; |
688 if (discard_transparency) { | 688 if (discard_transparency) { |
689 output_color_components = 3; | 689 output_color_components = 3; |
690 png_output_color_type = PNG_COLOR_TYPE_RGB; | 690 png_output_color_type = PNG_COLOR_TYPE_RGB; |
691 converter = ConvertSkiatoRGB; | 691 converter = ConvertSkiaToRGB; |
692 } else { | 692 } else { |
693 output_color_components = 4; | 693 output_color_components = 4; |
694 png_output_color_type = PNG_COLOR_TYPE_RGB_ALPHA; | 694 png_output_color_type = PNG_COLOR_TYPE_RGB_ALPHA; |
695 converter = ConvertSkiatoRGBA; | 695 converter = ConvertSkiaToRGBA; |
696 } | 696 } |
697 } | 697 } |
698 break; | 698 break; |
699 | 699 |
700 default: | 700 default: |
701 NOTREACHED() << "Unknown pixel format"; | 701 NOTREACHED() << "Unknown pixel format"; |
702 return false; | 702 return false; |
703 } | 703 } |
704 | 704 |
705 // Row stride should be at least as long as the length of the data. | 705 // Row stride should be at least as long as the length of the data. |
(...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
801 } | 801 } |
802 | 802 |
803 PNGCodec::Comment::Comment(const std::string& k, const std::string& t) | 803 PNGCodec::Comment::Comment(const std::string& k, const std::string& t) |
804 : key(k), text(t) { | 804 : key(k), text(t) { |
805 } | 805 } |
806 | 806 |
807 PNGCodec::Comment::~Comment() { | 807 PNGCodec::Comment::~Comment() { |
808 } | 808 } |
809 | 809 |
810 } // namespace gfx | 810 } // namespace gfx |
OLD | NEW |