1 /*
2 * Copyright 2013 Google Inc.
3 *
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
6 */
7
8 #include "SkBitmap.h"
9 #include "SkDecodingImageGenerator.h"
10 #include "SkForceLinking.h"
11 #include "SkImageDecoder.h"
12 #include "SkPixelRef.h"
13 #include "SkStream.h"
14 #include "SkTemplates.h"
15 #include "Test.h"
16
17 __SK_FORCE_IMAGE_DECODER_LINKING;
18
19 #define JPEG_TEST_WRITE_TO_FILE_FOR_DEBUGGING 0 // do not do this for
20 // normal unit testing.
21 static unsigned char goodJpegImage[] = {
22 0xFF, 0xD8, 0xFF, 0xE0, 0x00, 0x10, 0x4A, 0x46,
23 0x49, 0x46, 0x00, 0x01, 0x01, 0x01, 0x00, 0x8F,
24 0x00, 0x8F, 0x00, 0x00, 0xFF, 0xDB, 0x00, 0x43,
25 0x00, 0x05, 0x03, 0x04, 0x04, 0x04, 0x03, 0x05,
26 0x04, 0x04, 0x04, 0x05, 0x05, 0x05, 0x06, 0x07,
27 0x0C, 0x08, 0x07, 0x07, 0x07, 0x07, 0x0F, 0x0B,
28 0x0B, 0x09, 0x0C, 0x11, 0x0F, 0x12, 0x12, 0x11,
29 0x0F, 0x11, 0x11, 0x13, 0x16, 0x1C, 0x17, 0x13,
30 0x14, 0x1A, 0x15, 0x11, 0x11, 0x18, 0x21, 0x18,
31 0x1A, 0x1D, 0x1D, 0x1F, 0x1F, 0x1F, 0x13, 0x17,
32 0x22, 0x24, 0x22, 0x1E, 0x24, 0x1C, 0x1E, 0x1F,
33 0x1E, 0xFF, 0xDB, 0x00, 0x43, 0x01, 0x05, 0x05,
34 0x05, 0x07, 0x06, 0x07, 0x0E, 0x08, 0x08, 0x0E,
35 0x1E, 0x14, 0x11, 0x14, 0x1E, 0x1E, 0x1E, 0x1E,
36 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E,
37 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E,
38 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E,
39 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E,
40 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E,
41 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0xFF, 0xC0,
42 0x00, 0x11, 0x08, 0x00, 0x80, 0x00, 0x80, 0x03,
43 0x01, 0x22, 0x00, 0x02, 0x11, 0x01, 0x03, 0x11,
44 0x01, 0xFF, 0xC4, 0x00, 0x18, 0x00, 0x01, 0x01,
45 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
46 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00,
47 0x08, 0x06, 0x05, 0xFF, 0xC4, 0x00, 0x4C, 0x10,
48 0x00, 0x00, 0x01, 0x07, 0x08, 0x05, 0x08, 0x05,
49 0x0A, 0x03, 0x09, 0x01, 0x00, 0x00, 0x00, 0x00,
50 0x00, 0x01, 0x02, 0x03, 0x04, 0x06, 0x07, 0x11,
51 0x05, 0x08, 0x12, 0x13, 0x14, 0x15, 0x38, 0xB4,
52 0x16, 0x17, 0x21, 0x31, 0x84, 0x18, 0x22, 0x23,
53 0x24, 0x58, 0xA5, 0xA6, 0xD2, 0x32, 0x51, 0x56,
54 0x61, 0xD3, 0x28, 0x33, 0x41, 0x48, 0x67, 0x85,
55 0x86, 0xC3, 0xE4, 0xF0, 0x25, 0x49, 0x55, 0x09,
56 0x34, 0x35, 0x36, 0x53, 0x68, 0x72, 0x81, 0xA7,
57 0xE2, 0xFF, 0xC4, 0x00, 0x14, 0x01, 0x01, 0x00,
58 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
59 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF,
60 0xC4, 0x00, 0x14, 0x11, 0x01, 0x00, 0x00, 0x00,
61 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
62 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xDA, 0x00,
63 0x0C, 0x03, 0x01, 0x00, 0x02, 0x11, 0x03, 0x11,
64 0x00, 0x3F, 0x00, 0xD9, 0x62, 0x10, 0x80, 0x40,
65 0x65, 0xED, 0x62, 0x75, 0xC8, 0x7D, 0xFF, 0x00,
66 0x92, 0x30, 0x33, 0x01, 0x97, 0xB5, 0x89, 0xD7,
67 0x21, 0xF7, 0xFE, 0x48, 0xC0, 0x0C, 0xC2, 0x10,
68 0x80, 0x40, 0x66, 0x64, 0xB8, 0x62, 0x64, 0x78,
69 0xDC, 0xEA, 0x70, 0xCC, 0x06, 0x66, 0x4B, 0x86,
70 0x26, 0x47, 0x8D, 0xCE, 0xA7, 0x00, 0xCC, 0x21,
71 0x08, 0x04, 0x31, 0x9F, 0xF2, 0xC5, 0xFD, 0xFF,
72 0x00, 0x5A, 0x1B, 0x30, 0x63, 0x3F, 0xE5, 0x8B,
73 0xFB, 0xFE, 0xB4, 0x03, 0x66, 0x01, 0x99, 0x92,
74 0xE1, 0x89, 0x91, 0xE3, 0x73, 0xA9, 0xC3, 0x30,
75 0x19, 0x99, 0x2E, 0x18, 0x99, 0x1E, 0x37, 0x3A,
76 0x9C, 0x03, 0x30, 0x84, 0x33, 0x33, 0x92, 0x55,
77 0x7E, 0xCF, 0x29, 0xD8, 0x49, 0x0D, 0xAE, 0xBD,
78 0xAE, 0xAB, 0xC6, 0xBB, 0xAA, 0x68, 0x92, 0x92,
79 0x6A, 0xBA, 0xB4, 0xE9, 0x11, 0x7A, 0x7C, 0xD8,
80 0xC6, 0x84, 0x77, 0x12, 0x11, 0x87, 0xBC, 0x07,
81 0x67, 0xAC, 0x47, 0xED, 0xD9, 0xD3, 0xC6, 0xAA,
82 0x5E, 0x51, 0x6B, 0x11, 0xFB, 0x76, 0x74, 0xF1,
83 0xAA, 0x97, 0x94, 0x33, 0x08, 0x00, 0xCE, 0xB1,
84 0x1F, 0xB7, 0x67, 0x4F, 0x1A, 0xA9, 0x79, 0x41,
85 0x9B, 0xC4, 0x6C, 0xDE, 0xC2, 0xCB, 0xF6, 0x75,
86 0x92, 0x84, 0xA0, 0xE5, 0xEC, 0x12, 0xB2, 0x9D,
87 0xEF, 0x76, 0xC9, 0xBA, 0x50, 0xAA, 0x92, 0xF1,
88 0xA6, 0xAA, 0x69, 0x12, 0xF4, 0xA4, 0x36, 0x8A,
89 0x2A, 0xB3, 0x60, 0x77, 0x3A, 0x34, 0xA3, 0x02,
90 0x6D, 0x1A, 0xC8, 0x0C, 0xBD, 0xAC, 0x4E, 0xB9,
91 0x0F, 0xBF, 0xF2, 0x46, 0x00, 0xB5, 0x88, 0xFD,
92 0xBB, 0x3A, 0x78, 0xD5, 0x4B, 0xCA, 0x2D, 0x62,
93 0x3F, 0x6E, 0xCE, 0x9E, 0x35, 0x52, 0xF2, 0x86,
94 0x61, 0x00, 0x19, 0xD6, 0x23, 0xF6, 0xEC, 0xE9,
95 0xE3, 0x55, 0x2F, 0x28, 0x33, 0x9A, 0xE3, 0x66,
96 0xF6, 0x24, 0x97, 0x12, 0xCE, 0xC9, 0xEC, 0xCB,
97 0x97, 0xD2, 0x49, 0x25, 0x15, 0xAA, 0xCF, 0x29,
98 0x69, 0x42, 0xAA, 0xA5, 0x7C, 0x56, 0x92, 0x94,
99 0xEE, 0x88, 0xF3, 0x4A, 0x71, 0xB4, 0x4E, 0x29,
100 0xC6, 0xED, 0xDF, 0x46, 0x3B, 0x8A, 0x35, 0x90,
101 0x19, 0x99, 0x2E, 0x18, 0x99, 0x1E, 0x37, 0x3A,
102 0x9C, 0x01, 0x9B, 0xE4, 0x79, 0x73, 0x93, 0x59,
103 0x69, 0xD9, 0x36, 0x65, 0x99, 0x62, 0x34, 0x1E,
104 0x56, 0x95, 0xAD, 0x96, 0x75, 0x7B, 0xD6, 0x4F,
105 0x94, 0x6F, 0x1A, 0xA3, 0x0C, 0x3C, 0xEE, 0x71,
106 0xE6, 0x51, 0x45, 0x56, 0x6D, 0x22, 0xED, 0x29,
107 0x29, 0x53, 0xFA, 0x4A, 0x41, 0xE2, 0xFC, 0xBB,
108 0x3F, 0x77, 0x28, 0x66, 0x7B, 0x58, 0x9D, 0x72,
109 0x1F, 0x7F, 0xE4, 0x8C, 0x0C, 0xC0, 0x31, 0x9F,
110 0xCB, 0xB3, 0xF7, 0x72, 0x8F, 0x19, 0xB6, 0x76,
111 0x8F, 0x61, 0x8B, 0x99, 0xDA, 0xDA, 0x16, 0x99,
112 0xB7, 0xB0, 0x49, 0x2A, 0x74, 0x2D, 0x0C, 0x9D,
113 0xD4, 0xAA, 0x92, 0x85, 0x39, 0x40, 0xD2, 0x9B,
114 0xD7, 0x0C, 0x3C, 0xA7, 0x16, 0x27, 0x1C, 0x6A,
115 0x5D, 0x91, 0xDF, 0x43, 0x70, 0xDC, 0xA2, 0x01,
116 0x8C, 0xF5, 0xC1, 0xFE, 0xF1, 0x3F, 0xF3, 0x4F,
117 0xFE, 0x07, 0xB5, 0x35, 0xC6, 0x31, 0xEC, 0x4A,
118 0xCE, 0x25, 0x9D, 0x94, 0x19, 0x97, 0xD1, 0xA3,
119 0x72, 0x4A, 0x5B, 0x55, 0x9E, 0x4D, 0xD1, 0x75,
120 0x55, 0xBA, 0x88, 0x2D, 0x25, 0x21, 0xDD, 0x29,
121 0xE7, 0x10, 0xE3, 0xA9, 0x1C, 0x43, 0x8E, 0xDB,
122 0xBA, 0x94, 0x37, 0x10, 0x6B, 0x21, 0x00, 0x19,
123 0xD5, 0xDB, 0xF6, 0xED, 0x17, 0xE0, 0xA5, 0x2F,
124 0x30, 0x33, 0x9A, 0xE3, 0x18, 0xF6, 0x25, 0x67,
125 0x12, 0xCE, 0xCA, 0x0C, 0xCB, 0xE8, 0xD1, 0xB9,
126 0x25, 0x2D, 0xAA, 0xCF, 0x26, 0xE8, 0xBA, 0xAA,
127 0xDD, 0x44, 0x16, 0x92, 0x90, 0xEE, 0x94, 0xF3,
128 0x88, 0x71, 0xD4, 0x8E, 0x21, 0xC7, 0x6D, 0xDD,
129 0x4A, 0x1B, 0x88, 0x35, 0x90, 0x19, 0x99, 0x2E,
130 0x18, 0x99, 0x1E, 0x37, 0x3A, 0x9C, 0x03, 0x30,
131 0x80, 0x04, 0xDB, 0x99, 0x69, 0x09, 0x8B, 0x7E,
132 0xCF, 0x8D, 0x99, 0x66, 0x54, 0x6C, 0x12, 0x4A,
133 0x9D, 0xC7, 0x67, 0x57, 0xAD, 0x3D, 0x25, 0x0A,
134 0x6A, 0xA9, 0x4F, 0x3B, 0x9C, 0x79, 0x4A, 0x71,
135 0x62, 0x71, 0xC7, 0x17, 0x69, 0x4B, 0xBF, 0xD4,
136 0x1F, 0xC0, 0x43, 0x8C, 0x79, 0xAE, 0xB5, 0x84,
137 0x79, 0x57, 0x7E, 0x9A, 0xC8, 0x57, 0xAD, 0xDD,
138 0x5B, 0x64, 0xEB, 0x69, 0xD0, 0xD5, 0xD6, 0x50,
139 0xA7, 0xF3, 0x47, 0x9B, 0x18, 0xD0, 0x33, 0x7C,
140 0x61, 0x0D, 0x9F, 0x48, 0xEC, 0xC0, 0x03, 0x12,
141 0xFB, 0x5E, 0xC3, 0x68, 0xCC, 0x2A, 0x34, 0xCC,
142 0xCB, 0x83, 0xB7, 0xC9, 0x2B, 0x94, 0xEC, 0xEB,
143 0x1A, 0x5E, 0xAA, 0x8E, 0x9D, 0x03, 0xCE, 0x30,
144 0xEE, 0x69, 0xE8, 0xC8, 0x71, 0x20, 0x71, 0xA7,
145 0x13, 0x69, 0x09, 0xBB, 0xD4, 0x03, 0xD9, 0xE4,
146 0xB8, 0xE2, 0x7D, 0x86, 0xEF, 0x65, 0xDF, 0x8C,
147 0x2E, 0x4B, 0x8E, 0x27, 0xD8, 0x6E, 0xF6, 0x5D,
148 0xF8, 0xC2, 0xD6, 0x23, 0xF6, 0xEC, 0xE9, 0xE3,
149 0x55, 0x2F, 0x28, 0xB5, 0x88, 0xFD, 0xBB, 0x3A,
150 0x78, 0xD5, 0x4B, 0xCA, 0x02, 0xE4, 0xB8, 0xE2,
151 0x7D, 0x86, 0xEF, 0x65, 0xDF, 0x8C, 0x0C, 0xE6,
152 0xB8, 0xE1, 0x1D, 0x3B, 0x68, 0xE2, 0x59, 0xD6,
153 0x99, 0xA6, 0x65, 0x2D, 0xF2, 0xB2, 0xE5, 0xAA,
154 0xD0, 0xB1, 0x78, 0x2D, 0x23, 0xA7, 0x41, 0x69,
155 0x29, 0x86, 0xF3, 0x4C, 0x48, 0x43, 0x49, 0x03,
156 0x4D, 0x34, 0x9B, 0x08, 0x4D, 0xDE, 0xB0, 0x99,
157 0xAC, 0x47, 0xED, 0xD9, 0xD3, 0xC6, 0xAA, 0x5E,
158 0x50, 0x67, 0x35, 0xC6, 0xCD, 0xEC, 0x49, 0x2E,
159 0x25, 0x9D, 0x93, 0xD9, 0x97, 0x2F, 0xA4, 0x92,
160 0x4A, 0x2B, 0x55, 0x9E, 0x52, 0xD2, 0x85, 0x55,
161 0x4A, 0xF8, 0xAD, 0x25, 0x29, 0xDD, 0x11, 0xE6,
162 0x94, 0xE3, 0x68, 0x9C, 0x53, 0x8D, 0xDB, 0xBE,
163 0x8C, 0x77, 0x14, 0x04, 0xF1, 0x1C, 0x23, 0xA7,
164 0x92, 0x5F, 0xB3, 0xAC, 0x66, 0x64, 0xF6, 0x52,
165 0xA6, 0x49, 0x97, 0xAF, 0x7B, 0xC9, 0x5E, 0xF0,
166 0x5A, 0x3A, 0xBE, 0xA1, 0x54, 0xD3, 0xD1, 0x73,
167 0x8A, 0x90, 0xA7, 0x1B, 0x44, 0xE2, 0x94, 0xBC,
168 0xD2, 0x92, 0x3F, 0x4C, 0x48, 0x13, 0x39, 0x2E,
169 0x38, 0x9F, 0x61, 0xBB, 0xD9, 0x77, 0xE3, 0x01,
170 0x97, 0xF4, 0xF7, 0x1B, 0xB6, 0x51, 0xE7, 0xBB,
171 0x76, 0xD5, 0xB5, 0x74, 0xB7, 0x15, 0xCD, 0x7A,
172 0x59, 0x15, 0x34, 0x89, 0x02, 0xCD, 0xBA, 0xB9,
173 0x02, 0x34, 0x47, 0xF3, 0xD1, 0x18, 0x5A, 0xBA,
174 0x14, 0x8C, 0x2E, 0xD2, 0x16, 0x95, 0x28, 0x12,
175 0x10, 0x29, 0x46, 0xCC, 0x00, 0x33, 0xC9, 0x71,
176 0xC4, 0xFB, 0x0D, 0xDE, 0xCB, 0xBF, 0x18, 0x5C,
177 0x97, 0x1C, 0x4F, 0xB0, 0xDD, 0xEC, 0xBB, 0xF1,
178 0x83, 0x30, 0x80, 0x0C, 0xF2, 0x5C, 0x71, 0x3E,
179 0xC3, 0x77, 0xB2, 0xEF, 0xC6, 0x17, 0x25, 0xC7,
180 0x13, 0xEC, 0x37, 0x7B, 0x2E, 0xFC, 0x60, 0xCC,
181 0x20, 0x03, 0x3C, 0x97, 0x1C, 0x4F, 0xB0, 0xDD,
182 0xEC, 0xBB, 0xF1, 0x81, 0x9C, 0xD7, 0x1C, 0x23,
183 0xA7, 0x6D, 0x1C, 0x4B, 0x3A, 0xD3, 0x34, 0xCC,
184 0xA5, 0xBE, 0x56, 0x5C, 0xB5, 0x5A, 0x16, 0x2F,
185 0x05, 0xA4, 0x74, 0xE8, 0x2D, 0x25, 0x30, 0xDE,
186 0x69, 0x89, 0x08, 0x69, 0x20, 0x69, 0xA6, 0x93,
187 0x61, 0x09, 0xBB, 0xD6, 0x35, 0x90, 0x19, 0x99,
188 0x2E, 0x18, 0x99, 0x1E, 0x37, 0x3A, 0x9C, 0x07,
189 0x8D, 0x36, 0xE6, 0xA6, 0x42, 0x6D, 0x1F, 0xB3,
190 0xE3, 0x69, 0x99, 0x95, 0xEB, 0x7C, 0x92, 0xB9,
191 0x71, 0xD9, 0xD6, 0x2A, 0x8F, 0x47, 0x4E, 0x82,
192 0xAA, 0x53, 0x0E, 0xE6, 0x9E, 0x42, 0x1C, 0x48,
193 0x1C, 0x69, 0xC4, 0xDA, 0x42, 0x6E, 0xF5, 0x07,
194 0xF1, 0x08, 0x00, 0xCB, 0x40, 0xF7, 0x1B, 0xBD,
195 0x67, 0xB4, 0xEC, 0x53, 0x14, 0xE9, 0x74, 0xAB,
196 0x47, 0x2C, 0x96, 0xB5, 0xBD, 0x22, 0x40, 0xA5,
197 0xFD, 0xE1, 0x01, 0x12, 0x99, 0xCC, 0x4A, 0x67,
198 0xFC, 0xC9, 0xB0, 0xA5, 0xF4, 0x62, 0x58, 0x44,
199 0x84, 0x06, 0x73, 0x5C, 0x6C, 0xDE, 0xC4, 0x92,
200 0xE2, 0x59, 0xD9, 0x3D, 0x99, 0x72, 0xFA, 0x49,
201 0x24, 0xA2, 0xB5, 0x59, 0xE5, 0x2D, 0x28, 0x55,
202 0x54, 0xAF, 0x8A, 0xD2, 0x52, 0x9D, 0xD1, 0x1E,
203 0x69, 0x4E, 0x36, 0x89, 0xC5, 0x38, 0xDD, 0xBB,
204 0xE8, 0xC7, 0x71, 0x42, 0x63, 0xA5, 0xC4, 0xEB,
205 0xEF, 0xFB, 0x83, 0x24, 0x78, 0xA6, 0x4B, 0x86,
206 0x26, 0x47, 0x8D, 0xCE, 0xA7, 0x01, 0x6B, 0x11,
207 0xFB, 0x76, 0x74, 0xF1, 0xAA, 0x97, 0x94, 0x5A,
208 0xC4, 0x7E, 0xDD, 0x9D, 0x3C, 0x6A, 0xA5, 0xE5,
209 0x0C, 0xC2, 0x00, 0x33, 0xAC, 0x47, 0xED, 0xD9,
210 0xD3, 0xC6, 0xAA, 0x5E, 0x50, 0x67, 0x35, 0xC6,
211 0xCD, 0xEC, 0x49, 0x2E, 0x25, 0x9D, 0x93, 0xD9,
212 0x97, 0x2F, 0xA4, 0x92, 0x4A, 0x2B, 0x55, 0x9E,
213 0x52, 0xD2, 0x85, 0x55, 0x4A, 0xF8, 0xAD, 0x25,
214 0x29, 0xDD, 0x11, 0xE6, 0x94, 0xE3, 0x68, 0x9C,
215 0x53, 0x8D, 0xDB, 0xBE, 0x8C, 0x77, 0x14, 0x6B,
216 0x20, 0x33, 0x32, 0x5C, 0x31, 0x32, 0x3C, 0x6E,
217 0x75, 0x38, 0x0C, 0xCD, 0x3E, 0x76, 0x89, 0xBB,
218 0x97, 0xF4, 0x3B, 0x4D, 0x5D, 0xD6, 0x86, 0xD4,
219 0x5B, 0xAC, 0x9F, 0xC6, 0x90, 0x2F, 0xDA, 0xA9,
220 0x59, 0xE9, 0xFC, 0xD1, 0x09, 0x42, 0x8C, 0x0C,
221 0xDF, 0xBE, 0x9E, 0xCD, 0xC5, 0x1A, 0x67, 0x58,
222 0x8F, 0xDB, 0xB3, 0xA7, 0x8D, 0x54, 0xBC, 0xA3,
223 0x8C, 0xFE, 0xD0, 0x76, 0x16, 0xFF, 0x00, 0x76,
224 0x0A, 0xAD, 0xAD, 0xE9, 0x66, 0xD1, 0x5A, 0x7D,
225 0x52, 0xCF, 0x4E, 0xD5, 0x6A, 0x4E, 0xAC, 0x8B,
226 0xD3, 0xA4, 0x4A, 0x14, 0x61, 0x1D, 0xC7, 0x47,
227 0x76, 0xCD, 0xE2, 0x7D, 0xAA, 0xAF, 0xD9, 0xDA,
228 0xBB, 0x09, 0x5D, 0xB5, 0xD7, 0xB5, 0xEB, 0x77,
229 0x54, 0xF5, 0x4D, 0x12, 0x52, 0x43, 0x59, 0x58,
230 0x9D, 0x1A, 0x2F, 0x4F, 0x9D, 0x08, 0x53, 0x8E,
231 0xE2, 0xC6, 0x10, 0xF7, 0x80, 0xEC, 0xF5, 0x88,
232 0xFD, 0xBB, 0x3A, 0x78, 0xD5, 0x4B, 0xCA, 0x2D,
233 0x62, 0x3F, 0x6E, 0xCE, 0x9E, 0x35, 0x52, 0xF2,
234 0x8C, 0x67, 0xCA, 0x8D, 0xFB, 0x7B, 0x73, 0xDD,
235 0x2A, 0x5F, 0x04, 0x5C, 0xA8, 0xDF, 0xB7, 0xB7,
236 0x3D, 0xD2, 0xA5, 0xF0, 0x40, 0x6C, 0xCD, 0x62,
237 0x3F, 0x6E, 0xCE, 0x9E, 0x35, 0x52, 0xF2, 0x8B,
238 0x58, 0x8F, 0xDB, 0xB3, 0xA7, 0x8D, 0x54, 0xBC,
239 0xA3, 0x33, 0x3B, 0x27, 0xA5, 0x3B, 0x17, 0x95,
240 0x78, 0x68, 0x54, 0xBB, 0x7A, 0xDD, 0xD5, 0x56,
241 0xBE, 0xA9, 0x25, 0xA1, 0xAB, 0xAC, 0xA7, 0x43,
242 0xE7, 0x4C, 0x36, 0x31, 0xA0, 0x7E, 0xE8, 0xC2,
243 0x1B, 0x7E, 0x81, 0xD9, 0xFC, 0xBB, 0x3F, 0x77,
244 0x28, 0x06, 0x6D, 0x62, 0x3F, 0x6E, 0xCE, 0x9E,
245 0x35, 0x52, 0xF2, 0x83, 0x39, 0xAE, 0x36, 0x6F,
246 0x62, 0x49, 0x71, 0x2C, 0xEC, 0x9E, 0xCC, 0xB9,
247 0x7D, 0x24, 0x92, 0x51, 0x5A, 0xAC, 0xF2, 0x96,
248 0x94, 0x2A, 0xAA, 0x57, 0xC5, 0x69, 0x29, 0x4E,
249 0xE8, 0x8F, 0x34, 0xA7, 0x1B, 0x44, 0xE2, 0x9C,
250 0x6E, 0xDD, 0xF4, 0x63, 0xB8, 0xA3, 0xC5, 0xF9,
251 0x76, 0x7E, 0xEE, 0x51, 0xC6, 0x39, 0x2E, 0x56,
252 0x3A, 0xB0, 0x92, 0x35, 0x69, 0xFE, 0x53, 0xE9,
253 0xAC, 0x1F, 0xE1, 0x7F, 0xEB, 0xA4, 0xAC, 0xF9,
254 0xFE, 0x93, 0xE7, 0x2B, 0x3D, 0x2F, 0xFA, 0xD9,
255 0x00, 0x1B, 0xFC, 0x42, 0x10, 0x0C, 0x9A, 0xD4,
256 0xBE, 0x39, 0x09, 0xCF, 0xBF, 0x67, 0xD5, 0x28,
257 0x4A, 0x08, 0x6D, 0xF2, 0xB2, 0xE5, 0xC3, 0x76,
258 0xC9, 0xB4, 0x8F, 0x47, 0x6B, 0xA0, 0xAA, 0x42,
259 0x25, 0xE9, 0x48, 0x8C, 0xF3, 0x4C, 0xA0, 0x6A,
260 0x42, 0x1D, 0xCE, 0x84, 0x61, 0x02, 0x6D, 0xDC,
261 0x64, 0xE4, 0xA7, 0x5B, 0xAB, 0x57, 0x61, 0x24,
262 0x31, 0x5A, 0x05, 0x7A, 0xDD, 0xD5, 0xDD, 0x6E,
263 0xF7, 0xA9, 0xAC, 0xAC, 0x4E, 0x91, 0x2F, 0xA1,
264 0x52, 0x74, 0x21, 0x4E, 0x1B, 0xCB, 0x18, 0x47,
265 0xDC, 0x34, 0xCC, 0xF6, 0xB0, 0xC4, 0xD7, 0x70,
266 0x59, 0xD4, 0x02, 0x99, 0x2E, 0x18, 0x99, 0x1E,
267 0x37, 0x3A, 0x9C, 0x00, 0xCF, 0x2E, 0x7F, 0xB2,
268 0xEE, 0xFF, 0x00, 0xFD, 0x38, 0xB9, 0x73, 0xFD,
269 0x97, 0x77, 0xFF, 0x00, 0xE9, 0xC6, 0xCC, 0x10,
270 0x0C, 0x67, 0xCB, 0x9F, 0xEC, 0xBB, 0xBF, 0xFF,
271 0x00, 0x4E, 0x38, 0xC7, 0x25, 0x3A, 0xDD, 0x5A,
272 0xBB, 0x09, 0x21, 0x8A, 0xD0, 0x2B, 0xD6, 0xEE,
273 0xAE, 0xEB, 0x77, 0xBD, 0x4D, 0x65, 0x62, 0x74,
274 0x89, 0x7D, 0x0A, 0x93, 0xA1, 0x0A, 0x70, 0xDE,
275 0x58, 0xC2, 0x3E, 0xE1, 0xBF, 0xC0, 0xCC, 0xC9,
276 0x70, 0xC4, 0xC8, 0xF1, 0xB9, 0xD4, 0xE0, 0x33,
277 0x33, 0xED, 0x9D, 0x6E, 0xB2, 0x9D, 0x84, 0xAE,
278 0xC5, 0x68, 0x15, 0xD5, 0x78, 0xD4, 0xF5, 0xBB,
279 0xDE, 0xBA, 0xAE, 0xAD, 0x3A, 0x34, 0xBE, 0x85,
280 0x49, 0xB1, 0x8D, 0x08, 0x6F, 0x24, 0x23, 0x1F,
281 0x70, 0x9F, 0x6C, 0xEB, 0x75, 0x94, 0xEC, 0x25,
282 0x76, 0x2B, 0x40, 0xAE, 0xAB, 0xC6, 0xA7, 0xAD,
283 0xDE, 0xF5, 0xD5, 0x75, 0x69, 0xD1, 0xA5, 0xF4,
284 0x2A, 0x4D, 0x8C, 0x68, 0x43, 0x79, 0x21, 0x18,
285 0xFB, 0x86, 0x99, 0x9E, 0xD6, 0x18, 0x9A, 0xEE,
286 0x0B, 0x3A, 0x80, 0x53, 0xDA, 0xC3, 0x13, 0x5D,
287 0xC1, 0x67, 0x50, 0x00, 0xCC, 0xCE, 0x4A, 0x75,
288 0xBA, 0xB5, 0x76, 0x12, 0x43, 0x15, 0xA0, 0x57,
289 0xAD, 0xDD, 0x5D, 0xD6, 0xEF, 0x7A, 0x9A, 0xCA,
290 0xC4, 0xE9, 0x12, 0xFA, 0x15, 0x27, 0x42, 0x14,
291 0xE1, 0xBC, 0xB1, 0x84, 0x7D, 0xC3, 0xB3, 0xE5,
292 0xCF, 0xF6, 0x5D, 0xDF, 0xFF, 0x00, 0xA7, 0x0C,
293 0xD3, 0x25, 0xC3, 0x13, 0x23, 0xC6, 0xE7, 0x53,
294 0x86, 0x60, 0x18, 0x01, 0x92, 0x9D, 0x6D, 0xC0,
295 0xF3, 0xDB, 0x76, 0xD7, 0x40, 0xAD, 0x3A, 0x55,
296 0x60, 0xEA, 0x97, 0xBD, 0x0B, 0x2D, 0x95, 0x01,
297 0x51, 0x7A, 0x75, 0x25, 0xA7, 0x4A, 0x31, 0xDC,
298 0x6C, 0x37, 0x6D, 0xDE, 0x3B, 0x3E, 0x5C, 0xFF,
299 0x00, 0x65, 0xDD, 0xFF, 0x00, 0xFA, 0x70, 0xCC,
300 0xE9, 0x71, 0x3A, 0xFB, 0xFE, 0xE0, 0xC9, 0x1E,
301 0x19, 0x80, 0x63, 0x3E, 0x5C, 0xFF, 0x00, 0x65,
302 0xDD, 0xFF, 0x00, 0xFA, 0x71, 0xC6, 0x39, 0x29,
303 0xD6, 0xEA, 0xD5, 0xD8, 0x49, 0x0C, 0x56, 0x81,
304 0x5E, 0xB7, 0x75, 0x77, 0x5B, 0xBD, 0xEA, 0x6B,
305 0x2B, 0x13, 0xA4, 0x4B, 0xE8, 0x54, 0x9D, 0x08,
306 0x53, 0x86, 0xF2, 0xC6, 0x11, 0xF7, 0x0D, 0xFE,
307 0x06, 0x66, 0x4B, 0x86, 0x26, 0x47, 0x8D, 0xCE,
308 0xA7, 0x00, 0xCC, 0x21, 0x08, 0x00, 0xCC, 0xF6,
309 0xB0, 0xC4, 0xD7, 0x70, 0x59, 0xD4, 0x02, 0x99,
310 0x2E, 0x18, 0x99, 0x1E, 0x37, 0x3A, 0x9C, 0x53,
311 0xDA, 0xC3, 0x13, 0x5D, 0xC1, 0x67, 0x50, 0x0A,
312 0x64, 0xB8, 0x62, 0x64, 0x78, 0xDC, 0xEA, 0x70,
313 0x0C, 0xC2, 0x10, 0x80, 0x40, 0x66, 0x64, 0xB8,
314 0x62, 0x64, 0x78, 0xDC, 0xEA, 0x70, 0xCC, 0x06,
315 0x66, 0x4B, 0x86, 0x26, 0x47, 0x8D, 0xCE, 0xA7,
316 0x01, 0x4F, 0x6B, 0x0C, 0x4D, 0x77, 0x05, 0x9D,
317 0x40, 0x29, 0xED, 0x61, 0x89, 0xAE, 0xE0, 0xB3,
318 0xA8, 0x05, 0x3D, 0xAC, 0x31, 0x35, 0xDC, 0x16,
319 0x75, 0x00, 0xA7, 0xB5, 0x86, 0x26, 0xBB, 0x82,
320 0xCE, 0xA0, 0x01, 0x4C, 0x97, 0x0C, 0x4C, 0x8F,
321 0x1B, 0x9D, 0x4E, 0x19, 0x86, 0x4D, 0x9A, 0xE3,
322 0xFB, 0x74, 0xEC, 0x5B, 0x89, 0x67, 0x59, 0x96,
323 0x99, 0xAB, 0xB0, 0x4A, 0xCA, 0x76, 0xAB, 0x42,
324 0xBD, 0xDE, 0xB4, 0x92, 0x85, 0x35, 0xA4, 0xA7,
325 0x9B, 0xCE, 0x31, 0x19, 0x4D, 0x2C, 0x4D, 0x38,
326 0xD2, 0xEC, 0x29, 0x77, 0xFA, 0xC2, 0x67, 0x2A,
327 0x37, 0x13, 0xED, 0xCF, 0x74, 0xAE, 0xFC, 0x10,
328 0x03, 0x33, 0x80, 0xFA, 0xCE, 0xFE, 0x13, 0xFC,
329 0xB0, 0xCD, 0x32, 0x5C, 0x31, 0x32, 0x3C, 0x6E,
330 0x75, 0x38, 0x00, 0x79, 0x2D, 0x4C, 0x84, 0xDA,
331 0x33, 0x13, 0x91, 0x69, 0x99, 0x95, 0xEB, 0x7C,
332 0x92, 0xB9, 0xA2, 0xF6, 0x75, 0x8A, 0xA3, 0xD1,
333 0xD3, 0xA0, 0x79, 0xA6, 0x1D, 0xCD, 0x3C, 0x84,
334 0x38, 0x90, 0x38, 0xD3, 0x89, 0xB4, 0x84, 0xDD,
335 0xEA, 0x0F, 0xF3, 0x25, 0xC3, 0x13, 0x23, 0xC6,
336 0xE7, 0x53, 0x80, 0x66, 0x03, 0x33, 0x25, 0xC3,
337 0x13, 0x23, 0xC6, 0xE7, 0x53, 0x86, 0x60, 0x33,
338 0x32, 0x5C, 0x31, 0x32, 0x3C, 0x6E, 0x75, 0x38,
339 0x06, 0x61, 0x08, 0x40, 0x06, 0x67, 0xB5, 0x86,
340 0x26, 0xBB, 0x82, 0xCE, 0xA0, 0x14, 0xC9, 0x70,
341 0xC4, 0xC8, 0xF1, 0xB9, 0xD4, 0xE2, 0x9E, 0xD6,
342 0x18, 0x9A, 0xEE, 0x0B, 0x3A, 0x80, 0x53, 0x25,
343 0xC3, 0x13, 0x23, 0xC6, 0xE7, 0x53, 0x80, 0x66,
344 0x10, 0x84, 0x02, 0x03, 0x33, 0x25, 0xC3, 0x13,
345 0x23, 0xC6, 0xE7, 0x53, 0x86, 0x60, 0x33, 0x32,
346 0x5C, 0x31, 0x32, 0x3C, 0x6E, 0x75, 0x38, 0x0A,
347 0x7B, 0x58, 0x62, 0x6B, 0xB8, 0x2C, 0xEA, 0x01,
348 0x4F, 0x6B, 0x0C, 0x4D, 0x77, 0x05, 0x9D, 0x40,
349 0x29, 0xED, 0x61, 0x89, 0xAE, 0xE0, 0xB3, 0xA8,
350 0x05, 0x3D, 0xAC, 0x31, 0x35, 0xDC, 0x16, 0x75,
351 0x00, 0x06, 0x61, 0x08, 0x40, 0x31, 0x9C, 0xEB,
352 0x65, 0x86, 0xEE, 0x5F, 0xD7, 0x2C, 0x93, 0xA6,
353 0x36, 0x66, 0x4D, 0x95, 0xB8, 0xFF, 0x00, 0x82,
354 0xDD, 0x88, 0x0F, 0xB5, 0x5A, 0xAA, 0x4E, 0xF9,
355 0xF8, 0x11, 0x21, 0x94, 0x52, 0x12, 0x9E, 0xF3,
356 0xA3, 0xBB, 0x61, 0x07, 0xB5, 0x35, 0xC6, 0x31,
357 0xEC, 0x4A, 0xCE, 0x25, 0x9D, 0x94, 0x19, 0x97,
358 0xD1, 0xA3, 0x72, 0x4A, 0x5B, 0x55, 0x9E, 0x4D,
359 0xD1, 0x75, 0x55, 0xBA, 0x88, 0x2D, 0x25, 0x21,
360 0xDD, 0x29, 0xE7, 0x10, 0xE3, 0xA9, 0x1C, 0x43,
361 0x8E, 0xDB, 0xBA, 0x94, 0x37, 0x10, 0x78, 0xB3,
362 0x80, 0xFA, 0xCE, 0xFE, 0x13, 0xFC, 0xB0, 0xCD,
363 0x32, 0x5C, 0x31, 0x32, 0x3C, 0x6E, 0x75, 0x38,
364 0x0B, 0x57, 0x6F, 0xDB, 0xB4, 0x5F, 0x82, 0x94,
365 0xBC, 0xC0, 0xCE, 0x6B, 0x8C, 0x63, 0xD8, 0x95,
366 0x9C, 0x4B, 0x3B, 0x28, 0x33, 0x2F, 0xA3, 0x46,
367 0xE4, 0x94, 0xB6, 0xAB, 0x3C, 0x9B, 0xA2, 0xEA,
368 0xAB, 0x75, 0x10, 0x5A, 0x4A, 0x43, 0xBA, 0x53,
369 0xCE, 0x21, 0xC7, 0x52, 0x38, 0x87, 0x1D, 0xB7,
370 0x75, 0x28, 0x6E, 0x20, 0xD6, 0x40, 0x66, 0x64,
371 0xB8, 0x62, 0x64, 0x78, 0xDC, 0xEA, 0x70, 0x16,
372 0xB1, 0x1F, 0xB7, 0x67, 0x4F, 0x1A, 0xA9, 0x79,
373 0x45, 0xAC, 0x47, 0xED, 0xD9, 0xD3, 0xC6, 0xAA,
374 0x5E, 0x50, 0xCC, 0x20, 0x19, 0x36, 0x74, 0x6D,
375 0x9B, 0xD8, 0x95, 0x9C, 0x4B, 0x45, 0x27, 0xB4,
376 0xCE, 0x5F, 0x46, 0xE4, 0x94, 0xB6, 0x5B, 0x44,
377 0xA5, 0xA5, 0x0A, 0xAB, 0x75, 0x10, 0x5A, 0x44,
378 0x53, 0x7A, 0x23, 0x0D, 0x21, 0xC7, 0x52, 0x38,
379 0x86, 0x9B, 0xB3, 0x75, 0x28, 0xEE, 0x20, 0xA6,
380 0xB8, 0xD9, 0xBD, 0x89, 0x25, 0xC4, 0xB3, 0xB2,
381 0x7B, 0x32, 0xE5, 0xF4, 0x92, 0x49, 0x45, 0x6A,
382 0xB3, 0xCA, 0x5A, 0x50, 0xAA, 0xA9, 0x5F, 0x15,
383 0xA4, 0xA5, 0x3B, 0xA2, 0x3C, 0xD2, 0x9C, 0x6D,
384 0x13, 0x8A, 0x71, 0xBB, 0x77, 0xD1, 0x8E, 0xE2,
385 0x84, 0xC9, 0xED, 0x61, 0x89, 0xAE, 0xE0, 0xB3,
386 0xA8, 0x05, 0x32, 0x5C, 0x31, 0x32, 0x3C, 0x6E,
387 0x75, 0x38, 0x0B, 0x58, 0x8F, 0xDB, 0xB3, 0xA7,
388 0x8D, 0x54, 0xBC, 0xA2, 0xD6, 0x23, 0xF6, 0xEC,
389 0xE9, 0xE3, 0x55, 0x2F, 0x28, 0x66, 0x10, 0x01,
390 0x9D, 0x62, 0x3F, 0x6E, 0xCE, 0x9E, 0x35, 0x52,
391 0xF2, 0x8F, 0x6A, 0x6B, 0x8C, 0xB4, 0xBA, 0xC5,
392 0xB8, 0x96, 0x75, 0x99, 0x69, 0x94, 0x6C, 0x12,
393 0xB2, 0x9D, 0xAA, 0xD0, 0xAF, 0x5A, 0x62, 0x4A,
394 0x14, 0xD6, 0x92, 0x9E, 0x6F, 0x38, 0xC2, 0x94,
395 0xD2, 0xC4, 0xD3, 0x8D, 0x2E, 0xC2, 0x97, 0x7F,
396 0xAC, 0x26, 0x08, 0x00, 0xCC, 0xF6, 0xB0, 0xC4,
397 0xD7, 0x70, 0x59, 0xD4, 0x02, 0x9E, 0xD6, 0x18,
398 0x9A, 0xEE, 0x0B, 0x3A, 0x80, 0x53, 0xDA, 0xC3,
399 0x13, 0x5D, 0xC1, 0x67, 0x50, 0x0A, 0x7B, 0x58,
400 0x62, 0x6B, 0xB8, 0x2C, 0xEA, 0x00, 0x0C, 0xC2,
401 0x10, 0x80, 0x63, 0x39, 0xC0, 0x7D, 0x67, 0x7F,
402 0x09, 0xFE, 0x58, 0x66, 0x99, 0x2E, 0x18, 0x99,
403 0x1E, 0x37, 0x3A, 0x9C, 0x0C, 0xCE, 0x03, 0xEB,
404 0x3B, 0xF8, 0x4F, 0xF2, 0xC3, 0x34, 0xC9, 0x70,
405 0xC4, 0xC8, 0xF1, 0xB9, 0xD4, 0xE0, 0x19, 0x80,
406 0xCC, 0xC9, 0x70, 0xC4, 0xC8, 0xF1, 0xB9, 0xD4,
407 0xE1, 0x98, 0x0C, 0xCC, 0x97, 0x0C, 0x4C, 0x8F,
408 0x1B, 0x9D, 0x4E, 0x03, 0xFF, 0xD9};
409 static const int goodJpegImageWidth = 128;
410 static const int goodJpegImageHeight = 128;
411
412 // https://code.google.com/p/android/issues/detail?id=42382
413 // https://code.google.com/p/android/issues/detail?id=9064
414 // https://code.google.com/p/skia/issues/detail?id=1649
415
416 /**
417 This test will test the ability of the SkImageDecoder to deal with
418 Jpeg files which have been mangled somehow. We want to display as
419 much of the jpeg as possible.
420 */
DEF_TEST(Jpeg,reporter)421 DEF_TEST(Jpeg, reporter) {
422 size_t len = sizeof(goodJpegImage) / 2;
423 // I am explicitly not putting the entire image into the
424 // DecodeMemory. This simulates a network error.
425
426 SkBitmap bm8888;
427 bool imageDecodeSuccess = SkImageDecoder::DecodeMemory(
428 static_cast<void *>(goodJpegImage), len, &bm8888);
429 REPORTER_ASSERT(reporter, imageDecodeSuccess);
430 REPORTER_ASSERT(reporter, bm8888.width() == goodJpegImageWidth);
431 REPORTER_ASSERT(reporter, bm8888.height() == goodJpegImageHeight);
432 REPORTER_ASSERT(reporter, !(bm8888.empty()));
433
434 // Pick a few pixels and verify that their colors match the colors
435 // we expect (given the original image).
436 REPORTER_ASSERT(reporter, bm8888.getColor(7, 9) == 0xffffffff);
437 REPORTER_ASSERT(reporter, bm8888.getColor(28, 3) == 0xff000000);
438 REPORTER_ASSERT(reporter, bm8888.getColor(27, 34) == 0xffffffff);
439 REPORTER_ASSERT(reporter, bm8888.getColor(71, 18) == 0xff000000);
440
441 #ifdef SK_BUILD_FOR_IOS // the iOS jpeg decoder fills to gray
442 REPORTER_ASSERT(reporter, bm8888.getColor(127, 127) == 0xff808080
443 || bm8888.getColor(127, 127) == SK_ColorWHITE);
444 #else
445 // This is the fill color
446 REPORTER_ASSERT(reporter, bm8888.getColor(127, 127) == SK_ColorWHITE);
447 #endif
448
449 #if JPEG_TEST_WRITE_TO_FILE_FOR_DEBUGGING
450 // Check to see that the resulting bitmap is nice
451 bool writeSuccess = (!(bm8888.empty())) && SkImageEncoder::EncodeFile(
452 "HalfOfAJpeg.png", bm8888, SkImageEncoder::kPNG_Type, 100);
453 SkASSERT(writeSuccess);
454 #endif
455 }
456
DEF_TEST(Jpeg_YUV,reporter)457 DEF_TEST(Jpeg_YUV, reporter) {
458 size_t len = sizeof(goodJpegImage);
459 SkMemoryStream* stream = SkNEW_ARGS(SkMemoryStream, (goodJpegImage, len));
460
461 SkBitmap bitmap;
462 SkDecodingImageGenerator::Options opts;
463 bool pixelsInstalled = SkInstallDiscardablePixelRef(
464 SkDecodingImageGenerator::Create(stream, opts), &bitmap);
465 REPORTER_ASSERT(reporter, pixelsInstalled);
466
467 if (!pixelsInstalled) {
468 return;
469 }
470
471 SkPixelRef* pixelRef = bitmap.pixelRef();
472 SkISize yuvSizes[3];
473 bool sizesComputed = (NULL != pixelRef) && pixelRef->getYUV8Planes(yuvSizes, NULL, NULL, NULL);
474 REPORTER_ASSERT(reporter, sizesComputed);
475
476 if (!sizesComputed) {
477 return;
478 }
479
480 // Allocate the memory for YUV
481 size_t totalSize(0);
482 size_t sizes[3], rowBytes[3];
483 const int32_t expected_sizes[] = {128, 64, 64};
484 for (int i = 0; i < 3; ++i) {
485 rowBytes[i] = yuvSizes[i].fWidth;
486 totalSize += sizes[i] = rowBytes[i] * yuvSizes[i].fHeight;
487 REPORTER_ASSERT(reporter, rowBytes[i] == (size_t)expected_sizes[i]);
488 REPORTER_ASSERT(reporter, yuvSizes[i].fWidth == expected_sizes[i]);
489 REPORTER_ASSERT(reporter, yuvSizes[i].fHeight == expected_sizes[i]);
490 }
491 SkAutoMalloc storage(totalSize);
492 void* planes[3];
493 planes[0] = storage.get();
494 planes[1] = (uint8_t*)planes[0] + sizes[0];
495 planes[2] = (uint8_t*)planes[1] + sizes[1];
496
497 // Get the YUV planes
498 REPORTER_ASSERT(reporter, pixelRef->getYUV8Planes(yuvSizes, planes, rowBytes, NULL));
499 }
500