OLD | NEW |
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 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 "ios/chrome/browser/webp_transcode/webp_decoder.h" | 5 #include "components/image_fetcher/ios/webp_decoder.h" |
6 | 6 |
7 #import <Foundation/Foundation.h> | 7 #import <Foundation/Foundation.h> |
8 #include <stdint.h> | 8 #include <stdint.h> |
9 #import <UIKit/UIKit.h> | 9 #import <UIKit/UIKit.h> |
10 | 10 |
11 #include "base/logging.h" | 11 #include "base/logging.h" |
12 #include "base/metrics/histogram.h" | 12 #include "base/metrics/histogram.h" |
13 | 13 |
14 namespace { | 14 namespace { |
15 | 15 |
(...skipping 18 matching lines...) Expand all Loading... |
34 | 34 |
35 void WriteTiffHeader(uint8_t* dst, | 35 void WriteTiffHeader(uint8_t* dst, |
36 int width, | 36 int width, |
37 int height, | 37 int height, |
38 int bytes_per_px, | 38 int bytes_per_px, |
39 bool has_alpha) { | 39 bool has_alpha) { |
40 // For non-alpha case, we omit tag 0x152 (ExtraSamples). | 40 // For non-alpha case, we omit tag 0x152 (ExtraSamples). |
41 const uint8_t num_ifd_entries = | 41 const uint8_t num_ifd_entries = |
42 has_alpha ? kNumIfdEntries : kNumIfdEntries - 1; | 42 has_alpha ? kNumIfdEntries : kNumIfdEntries - 1; |
43 uint8_t tiff_header[kHeaderSize] = { | 43 uint8_t tiff_header[kHeaderSize] = { |
44 0x49, 0x49, 0x2a, 0x00, // little endian signature | 44 0x49, 0x49, 0x2a, 0x00, // little endian signature |
45 8, 0, 0, 0, // offset to the unique IFD that follows | 45 8, 0, 0, 0, // offset to the unique IFD that follows |
46 // IFD (offset = 8). Entries must be written in increasing tag order. | 46 // IFD (offset = 8). Entries must be written in increasing tag order. |
47 num_ifd_entries, 0, // Number of entries in the IFD (12 bytes each). | 47 num_ifd_entries, 0, // Number of entries in the IFD (12 bytes each). |
48 0x00, 0x01, 3, 0, 1, 0, 0, 0, 0, 0, 0, 0, // 10: Width (TBD) | 48 0x00, 0x01, 3, 0, 1, 0, 0, 0, 0, 0, 0, 0, // 10: Width (TBD) |
49 0x01, 0x01, 3, 0, 1, 0, 0, 0, 0, 0, 0, 0, // 22: Height (TBD) | 49 0x01, 0x01, 3, 0, 1, 0, 0, 0, 0, 0, 0, 0, // 22: Height (TBD) |
50 0x02, 0x01, 3, 0, bytes_per_px, 0, 0, 0, // 34: BitsPerSample: 8888 | 50 0x02, 0x01, 3, 0, bytes_per_px, 0, 0, 0, // 34: BitsPerSample: 8888 |
51 kExtraDataOffset + 0, 0, 0, 0, | 51 kExtraDataOffset + 0, 0, 0, 0, 0x03, 0x01, 3, 0, 1, 0, 0, 0, 1, 0, 0, |
52 0x03, 0x01, 3, 0, 1, 0, 0, 0, 1, 0, 0, 0, // 46: Compression: none | 52 0, // 46: Compression: none |
53 0x06, 0x01, 3, 0, 1, 0, 0, 0, 2, 0, 0, 0, // 58: Photometric: RGB | 53 0x06, 0x01, 3, 0, 1, 0, 0, 0, 2, 0, 0, 0, // 58: Photometric: RGB |
54 0x11, 0x01, 4, 0, 1, 0, 0, 0, // 70: Strips offset: | 54 0x11, 0x01, 4, 0, 1, 0, 0, 0, // 70: Strips offset: |
55 kHeaderSize, 0, 0, 0, // data follows header | 55 kHeaderSize, 0, 0, 0, // data follows header |
56 0x12, 0x01, 3, 0, 1, 0, 0, 0, 1, 0, 0, 0, // 82: Orientation: topleft | 56 0x12, 0x01, 3, 0, 1, 0, 0, 0, 1, 0, 0, 0, // 82: Orientation: topleft |
57 0x15, 0x01, 3, 0, 1, 0, 0, 0, // 94: SamplesPerPixels | 57 0x15, 0x01, 3, 0, 1, 0, 0, 0, // 94: SamplesPerPixels |
58 bytes_per_px, 0, 0, 0, | 58 bytes_per_px, 0, 0, 0, 0x16, 0x01, 3, 0, 1, 0, 0, 0, 0, 0, 0, |
59 0x16, 0x01, 3, 0, 1, 0, 0, 0, 0, 0, 0, 0, // 106: Rows per strip (TBD) | 59 0, // 106: Rows per strip (TBD) |
60 0x17, 0x01, 4, 0, 1, 0, 0, 0, 0, 0, 0, 0, // 118: StripByteCount (TBD) | 60 0x17, 0x01, 4, 0, 1, 0, 0, 0, 0, 0, 0, 0, // 118: StripByteCount (TBD) |
61 0x1a, 0x01, 5, 0, 1, 0, 0, 0, // 130: X-resolution | 61 0x1a, 0x01, 5, 0, 1, 0, 0, 0, // 130: X-resolution |
62 kExtraDataOffset + 8, 0, 0, 0, | 62 kExtraDataOffset + 8, 0, 0, 0, 0x1b, 0x01, 5, 0, 1, 0, 0, |
63 0x1b, 0x01, 5, 0, 1, 0, 0, 0, // 142: Y-resolution | 63 0, // 142: Y-resolution |
64 kExtraDataOffset + 8, 0, 0, 0, | 64 kExtraDataOffset + 8, 0, 0, 0, 0x1c, 0x01, 3, 0, 1, 0, 0, 0, 1, 0, 0, |
65 0x1c, 0x01, 3, 0, 1, 0, 0, 0, 1, 0, 0, 0, // 154: PlanarConfiguration | 65 0, // 154: PlanarConfiguration |
66 0x28, 0x01, 3, 0, 1, 0, 0, 0, 2, 0, 0, 0, // 166: ResolutionUnit (inch) | 66 0x28, 0x01, 3, 0, 1, 0, 0, 0, 2, 0, 0, 0, // 166: ResolutionUnit (inch) |
67 0x52, 0x01, 3, 0, 1, 0, 0, 0, 1, 0, 0, 0, // 178: ExtraSamples: rgbA | 67 0x52, 0x01, 3, 0, 1, 0, 0, 0, 1, 0, 0, 0, // 178: ExtraSamples: rgbA |
68 0, 0, 0, 0, // 190: IFD terminator | 68 0, 0, 0, 0, // 190: IFD terminator |
69 // kExtraDataOffset: | 69 // kExtraDataOffset: |
70 8, 0, 8, 0, 8, 0, 8, 0, // BitsPerSample | 70 8, 0, 8, 0, 8, 0, 8, 0, // BitsPerSample |
71 72, 0, 0, 0, 1, 0, 0, 0 // 72 pixels/inch, for X/Y-resolution | 71 72, 0, 0, 0, 1, 0, 0, 0 // 72 pixels/inch, for X/Y-resolution |
72 }; | 72 }; |
73 | 73 |
74 // Fill placeholders in IFD: | 74 // Fill placeholders in IFD: |
75 PutLE32(tiff_header + 10 + 8, width); | 75 PutLE32(tiff_header + 10 + 8, width); |
76 PutLE32(tiff_header + 22 + 8, height); | 76 PutLE32(tiff_header + 22 + 8, height); |
77 PutLE32(tiff_header + 106 + 8, height); | 77 PutLE32(tiff_header + 106 + 8, height); |
78 PutLE32(tiff_header + 118 + 8, width * bytes_per_px * height); | 78 PutLE32(tiff_header + 118 + 8, width * bytes_per_px * height); |
79 if (!has_alpha) | 79 if (!has_alpha) |
80 PutLE32(tiff_header + 178, 0); | 80 PutLE32(tiff_header + 178, 0); |
81 | 81 |
(...skipping 161 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
243 } | 243 } |
244 UMA_HISTOGRAM_ENUMERATION("WebP.DecodedImageFormat", format, | 244 UMA_HISTOGRAM_ENUMERATION("WebP.DecodedImageFormat", format, |
245 DECODED_FORMAT_COUNT); | 245 DECODED_FORMAT_COUNT); |
246 delegate_->SetImageFeatures([result_data length], format); | 246 delegate_->SetImageFeatures([result_data length], format); |
247 delegate_->OnDataDecoded(result_data); | 247 delegate_->OnDataDecoded(result_data); |
248 output_buffer_.reset(); | 248 output_buffer_.reset(); |
249 return true; | 249 return true; |
250 } | 250 } |
251 | 251 |
252 } // namespace webp_transcode | 252 } // namespace webp_transcode |
OLD | NEW |