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 "SkData.h"
10#include "SkForceLinking.h"
11#include "SkImage.h"
12#include "SkImageDecoder.h"
13#include "SkStream.h"
14#include "Test.h"
15
16__SK_FORCE_IMAGE_DECODER_LINKING;
17
18#define JPEG_TEST_WRITE_TO_FILE_FOR_DEBUGGING 0  // do not do this for
19                                                 // normal unit testing.
20static unsigned char goodJpegImage[] = {
210xFF, 0xD8, 0xFF, 0xE0, 0x00, 0x10, 0x4A, 0x46,
220x49, 0x46, 0x00, 0x01, 0x01, 0x01, 0x00, 0x8F,
230x00, 0x8F, 0x00, 0x00, 0xFF, 0xDB, 0x00, 0x43,
240x00, 0x05, 0x03, 0x04, 0x04, 0x04, 0x03, 0x05,
250x04, 0x04, 0x04, 0x05, 0x05, 0x05, 0x06, 0x07,
260x0C, 0x08, 0x07, 0x07, 0x07, 0x07, 0x0F, 0x0B,
270x0B, 0x09, 0x0C, 0x11, 0x0F, 0x12, 0x12, 0x11,
280x0F, 0x11, 0x11, 0x13, 0x16, 0x1C, 0x17, 0x13,
290x14, 0x1A, 0x15, 0x11, 0x11, 0x18, 0x21, 0x18,
300x1A, 0x1D, 0x1D, 0x1F, 0x1F, 0x1F, 0x13, 0x17,
310x22, 0x24, 0x22, 0x1E, 0x24, 0x1C, 0x1E, 0x1F,
320x1E, 0xFF, 0xDB, 0x00, 0x43, 0x01, 0x05, 0x05,
330x05, 0x07, 0x06, 0x07, 0x0E, 0x08, 0x08, 0x0E,
340x1E, 0x14, 0x11, 0x14, 0x1E, 0x1E, 0x1E, 0x1E,
350x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E,
360x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E,
370x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E,
380x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E,
390x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E,
400x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0xFF, 0xC0,
410x00, 0x11, 0x08, 0x00, 0x80, 0x00, 0x80, 0x03,
420x01, 0x22, 0x00, 0x02, 0x11, 0x01, 0x03, 0x11,
430x01, 0xFF, 0xC4, 0x00, 0x18, 0x00, 0x01, 0x01,
440x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
450x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00,
460x08, 0x06, 0x05, 0xFF, 0xC4, 0x00, 0x4C, 0x10,
470x00, 0x00, 0x01, 0x07, 0x08, 0x05, 0x08, 0x05,
480x0A, 0x03, 0x09, 0x01, 0x00, 0x00, 0x00, 0x00,
490x00, 0x01, 0x02, 0x03, 0x04, 0x06, 0x07, 0x11,
500x05, 0x08, 0x12, 0x13, 0x14, 0x15, 0x38, 0xB4,
510x16, 0x17, 0x21, 0x31, 0x84, 0x18, 0x22, 0x23,
520x24, 0x58, 0xA5, 0xA6, 0xD2, 0x32, 0x51, 0x56,
530x61, 0xD3, 0x28, 0x33, 0x41, 0x48, 0x67, 0x85,
540x86, 0xC3, 0xE4, 0xF0, 0x25, 0x49, 0x55, 0x09,
550x34, 0x35, 0x36, 0x53, 0x68, 0x72, 0x81, 0xA7,
560xE2, 0xFF, 0xC4, 0x00, 0x14, 0x01, 0x01, 0x00,
570x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
580x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF,
590xC4, 0x00, 0x14, 0x11, 0x01, 0x00, 0x00, 0x00,
600x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
610x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xDA, 0x00,
620x0C, 0x03, 0x01, 0x00, 0x02, 0x11, 0x03, 0x11,
630x00, 0x3F, 0x00, 0xD9, 0x62, 0x10, 0x80, 0x40,
640x65, 0xED, 0x62, 0x75, 0xC8, 0x7D, 0xFF, 0x00,
650x92, 0x30, 0x33, 0x01, 0x97, 0xB5, 0x89, 0xD7,
660x21, 0xF7, 0xFE, 0x48, 0xC0, 0x0C, 0xC2, 0x10,
670x80, 0x40, 0x66, 0x64, 0xB8, 0x62, 0x64, 0x78,
680xDC, 0xEA, 0x70, 0xCC, 0x06, 0x66, 0x4B, 0x86,
690x26, 0x47, 0x8D, 0xCE, 0xA7, 0x00, 0xCC, 0x21,
700x08, 0x04, 0x31, 0x9F, 0xF2, 0xC5, 0xFD, 0xFF,
710x00, 0x5A, 0x1B, 0x30, 0x63, 0x3F, 0xE5, 0x8B,
720xFB, 0xFE, 0xB4, 0x03, 0x66, 0x01, 0x99, 0x92,
730xE1, 0x89, 0x91, 0xE3, 0x73, 0xA9, 0xC3, 0x30,
740x19, 0x99, 0x2E, 0x18, 0x99, 0x1E, 0x37, 0x3A,
750x9C, 0x03, 0x30, 0x84, 0x33, 0x33, 0x92, 0x55,
760x7E, 0xCF, 0x29, 0xD8, 0x49, 0x0D, 0xAE, 0xBD,
770xAE, 0xAB, 0xC6, 0xBB, 0xAA, 0x68, 0x92, 0x92,
780x6A, 0xBA, 0xB4, 0xE9, 0x11, 0x7A, 0x7C, 0xD8,
790xC6, 0x84, 0x77, 0x12, 0x11, 0x87, 0xBC, 0x07,
800x67, 0xAC, 0x47, 0xED, 0xD9, 0xD3, 0xC6, 0xAA,
810x5E, 0x51, 0x6B, 0x11, 0xFB, 0x76, 0x74, 0xF1,
820xAA, 0x97, 0x94, 0x33, 0x08, 0x00, 0xCE, 0xB1,
830x1F, 0xB7, 0x67, 0x4F, 0x1A, 0xA9, 0x79, 0x41,
840x9B, 0xC4, 0x6C, 0xDE, 0xC2, 0xCB, 0xF6, 0x75,
850x92, 0x84, 0xA0, 0xE5, 0xEC, 0x12, 0xB2, 0x9D,
860xEF, 0x76, 0xC9, 0xBA, 0x50, 0xAA, 0x92, 0xF1,
870xA6, 0xAA, 0x69, 0x12, 0xF4, 0xA4, 0x36, 0x8A,
880x2A, 0xB3, 0x60, 0x77, 0x3A, 0x34, 0xA3, 0x02,
890x6D, 0x1A, 0xC8, 0x0C, 0xBD, 0xAC, 0x4E, 0xB9,
900x0F, 0xBF, 0xF2, 0x46, 0x00, 0xB5, 0x88, 0xFD,
910xBB, 0x3A, 0x78, 0xD5, 0x4B, 0xCA, 0x2D, 0x62,
920x3F, 0x6E, 0xCE, 0x9E, 0x35, 0x52, 0xF2, 0x86,
930x61, 0x00, 0x19, 0xD6, 0x23, 0xF6, 0xEC, 0xE9,
940xE3, 0x55, 0x2F, 0x28, 0x33, 0x9A, 0xE3, 0x66,
950xF6, 0x24, 0x97, 0x12, 0xCE, 0xC9, 0xEC, 0xCB,
960x97, 0xD2, 0x49, 0x25, 0x15, 0xAA, 0xCF, 0x29,
970x69, 0x42, 0xAA, 0xA5, 0x7C, 0x56, 0x92, 0x94,
980xEE, 0x88, 0xF3, 0x4A, 0x71, 0xB4, 0x4E, 0x29,
990xC6, 0xED, 0xDF, 0x46, 0x3B, 0x8A, 0x35, 0x90,
1000x19, 0x99, 0x2E, 0x18, 0x99, 0x1E, 0x37, 0x3A,
1010x9C, 0x01, 0x9B, 0xE4, 0x79, 0x73, 0x93, 0x59,
1020x69, 0xD9, 0x36, 0x65, 0x99, 0x62, 0x34, 0x1E,
1030x56, 0x95, 0xAD, 0x96, 0x75, 0x7B, 0xD6, 0x4F,
1040x94, 0x6F, 0x1A, 0xA3, 0x0C, 0x3C, 0xEE, 0x71,
1050xE6, 0x51, 0x45, 0x56, 0x6D, 0x22, 0xED, 0x29,
1060x29, 0x53, 0xFA, 0x4A, 0x41, 0xE2, 0xFC, 0xBB,
1070x3F, 0x77, 0x28, 0x66, 0x7B, 0x58, 0x9D, 0x72,
1080x1F, 0x7F, 0xE4, 0x8C, 0x0C, 0xC0, 0x31, 0x9F,
1090xCB, 0xB3, 0xF7, 0x72, 0x8F, 0x19, 0xB6, 0x76,
1100x8F, 0x61, 0x8B, 0x99, 0xDA, 0xDA, 0x16, 0x99,
1110xB7, 0xB0, 0x49, 0x2A, 0x74, 0x2D, 0x0C, 0x9D,
1120xD4, 0xAA, 0x92, 0x85, 0x39, 0x40, 0xD2, 0x9B,
1130xD7, 0x0C, 0x3C, 0xA7, 0x16, 0x27, 0x1C, 0x6A,
1140x5D, 0x91, 0xDF, 0x43, 0x70, 0xDC, 0xA2, 0x01,
1150x8C, 0xF5, 0xC1, 0xFE, 0xF1, 0x3F, 0xF3, 0x4F,
1160xFE, 0x07, 0xB5, 0x35, 0xC6, 0x31, 0xEC, 0x4A,
1170xCE, 0x25, 0x9D, 0x94, 0x19, 0x97, 0xD1, 0xA3,
1180x72, 0x4A, 0x5B, 0x55, 0x9E, 0x4D, 0xD1, 0x75,
1190x55, 0xBA, 0x88, 0x2D, 0x25, 0x21, 0xDD, 0x29,
1200xE7, 0x10, 0xE3, 0xA9, 0x1C, 0x43, 0x8E, 0xDB,
1210xBA, 0x94, 0x37, 0x10, 0x6B, 0x21, 0x00, 0x19,
1220xD5, 0xDB, 0xF6, 0xED, 0x17, 0xE0, 0xA5, 0x2F,
1230x30, 0x33, 0x9A, 0xE3, 0x18, 0xF6, 0x25, 0x67,
1240x12, 0xCE, 0xCA, 0x0C, 0xCB, 0xE8, 0xD1, 0xB9,
1250x25, 0x2D, 0xAA, 0xCF, 0x26, 0xE8, 0xBA, 0xAA,
1260xDD, 0x44, 0x16, 0x92, 0x90, 0xEE, 0x94, 0xF3,
1270x88, 0x71, 0xD4, 0x8E, 0x21, 0xC7, 0x6D, 0xDD,
1280x4A, 0x1B, 0x88, 0x35, 0x90, 0x19, 0x99, 0x2E,
1290x18, 0x99, 0x1E, 0x37, 0x3A, 0x9C, 0x03, 0x30,
1300x80, 0x04, 0xDB, 0x99, 0x69, 0x09, 0x8B, 0x7E,
1310xCF, 0x8D, 0x99, 0x66, 0x54, 0x6C, 0x12, 0x4A,
1320x9D, 0xC7, 0x67, 0x57, 0xAD, 0x3D, 0x25, 0x0A,
1330x6A, 0xA9, 0x4F, 0x3B, 0x9C, 0x79, 0x4A, 0x71,
1340x62, 0x71, 0xC7, 0x17, 0x69, 0x4B, 0xBF, 0xD4,
1350x1F, 0xC0, 0x43, 0x8C, 0x79, 0xAE, 0xB5, 0x84,
1360x79, 0x57, 0x7E, 0x9A, 0xC8, 0x57, 0xAD, 0xDD,
1370x5B, 0x64, 0xEB, 0x69, 0xD0, 0xD5, 0xD6, 0x50,
1380xA7, 0xF3, 0x47, 0x9B, 0x18, 0xD0, 0x33, 0x7C,
1390x61, 0x0D, 0x9F, 0x48, 0xEC, 0xC0, 0x03, 0x12,
1400xFB, 0x5E, 0xC3, 0x68, 0xCC, 0x2A, 0x34, 0xCC,
1410xCB, 0x83, 0xB7, 0xC9, 0x2B, 0x94, 0xEC, 0xEB,
1420x1A, 0x5E, 0xAA, 0x8E, 0x9D, 0x03, 0xCE, 0x30,
1430xEE, 0x69, 0xE8, 0xC8, 0x71, 0x20, 0x71, 0xA7,
1440x13, 0x69, 0x09, 0xBB, 0xD4, 0x03, 0xD9, 0xE4,
1450xB8, 0xE2, 0x7D, 0x86, 0xEF, 0x65, 0xDF, 0x8C,
1460x2E, 0x4B, 0x8E, 0x27, 0xD8, 0x6E, 0xF6, 0x5D,
1470xF8, 0xC2, 0xD6, 0x23, 0xF6, 0xEC, 0xE9, 0xE3,
1480x55, 0x2F, 0x28, 0xB5, 0x88, 0xFD, 0xBB, 0x3A,
1490x78, 0xD5, 0x4B, 0xCA, 0x02, 0xE4, 0xB8, 0xE2,
1500x7D, 0x86, 0xEF, 0x65, 0xDF, 0x8C, 0x0C, 0xE6,
1510xB8, 0xE1, 0x1D, 0x3B, 0x68, 0xE2, 0x59, 0xD6,
1520x99, 0xA6, 0x65, 0x2D, 0xF2, 0xB2, 0xE5, 0xAA,
1530xD0, 0xB1, 0x78, 0x2D, 0x23, 0xA7, 0x41, 0x69,
1540x29, 0x86, 0xF3, 0x4C, 0x48, 0x43, 0x49, 0x03,
1550x4D, 0x34, 0x9B, 0x08, 0x4D, 0xDE, 0xB0, 0x99,
1560xAC, 0x47, 0xED, 0xD9, 0xD3, 0xC6, 0xAA, 0x5E,
1570x50, 0x67, 0x35, 0xC6, 0xCD, 0xEC, 0x49, 0x2E,
1580x25, 0x9D, 0x93, 0xD9, 0x97, 0x2F, 0xA4, 0x92,
1590x4A, 0x2B, 0x55, 0x9E, 0x52, 0xD2, 0x85, 0x55,
1600x4A, 0xF8, 0xAD, 0x25, 0x29, 0xDD, 0x11, 0xE6,
1610x94, 0xE3, 0x68, 0x9C, 0x53, 0x8D, 0xDB, 0xBE,
1620x8C, 0x77, 0x14, 0x04, 0xF1, 0x1C, 0x23, 0xA7,
1630x92, 0x5F, 0xB3, 0xAC, 0x66, 0x64, 0xF6, 0x52,
1640xA6, 0x49, 0x97, 0xAF, 0x7B, 0xC9, 0x5E, 0xF0,
1650x5A, 0x3A, 0xBE, 0xA1, 0x54, 0xD3, 0xD1, 0x73,
1660x8A, 0x90, 0xA7, 0x1B, 0x44, 0xE2, 0x94, 0xBC,
1670xD2, 0x92, 0x3F, 0x4C, 0x48, 0x13, 0x39, 0x2E,
1680x38, 0x9F, 0x61, 0xBB, 0xD9, 0x77, 0xE3, 0x01,
1690x97, 0xF4, 0xF7, 0x1B, 0xB6, 0x51, 0xE7, 0xBB,
1700x76, 0xD5, 0xB5, 0x74, 0xB7, 0x15, 0xCD, 0x7A,
1710x59, 0x15, 0x34, 0x89, 0x02, 0xCD, 0xBA, 0xB9,
1720x02, 0x34, 0x47, 0xF3, 0xD1, 0x18, 0x5A, 0xBA,
1730x14, 0x8C, 0x2E, 0xD2, 0x16, 0x95, 0x28, 0x12,
1740x10, 0x29, 0x46, 0xCC, 0x00, 0x33, 0xC9, 0x71,
1750xC4, 0xFB, 0x0D, 0xDE, 0xCB, 0xBF, 0x18, 0x5C,
1760x97, 0x1C, 0x4F, 0xB0, 0xDD, 0xEC, 0xBB, 0xF1,
1770x83, 0x30, 0x80, 0x0C, 0xF2, 0x5C, 0x71, 0x3E,
1780xC3, 0x77, 0xB2, 0xEF, 0xC6, 0x17, 0x25, 0xC7,
1790x13, 0xEC, 0x37, 0x7B, 0x2E, 0xFC, 0x60, 0xCC,
1800x20, 0x03, 0x3C, 0x97, 0x1C, 0x4F, 0xB0, 0xDD,
1810xEC, 0xBB, 0xF1, 0x81, 0x9C, 0xD7, 0x1C, 0x23,
1820xA7, 0x6D, 0x1C, 0x4B, 0x3A, 0xD3, 0x34, 0xCC,
1830xA5, 0xBE, 0x56, 0x5C, 0xB5, 0x5A, 0x16, 0x2F,
1840x05, 0xA4, 0x74, 0xE8, 0x2D, 0x25, 0x30, 0xDE,
1850x69, 0x89, 0x08, 0x69, 0x20, 0x69, 0xA6, 0x93,
1860x61, 0x09, 0xBB, 0xD6, 0x35, 0x90, 0x19, 0x99,
1870x2E, 0x18, 0x99, 0x1E, 0x37, 0x3A, 0x9C, 0x07,
1880x8D, 0x36, 0xE6, 0xA6, 0x42, 0x6D, 0x1F, 0xB3,
1890xE3, 0x69, 0x99, 0x95, 0xEB, 0x7C, 0x92, 0xB9,
1900x71, 0xD9, 0xD6, 0x2A, 0x8F, 0x47, 0x4E, 0x82,
1910xAA, 0x53, 0x0E, 0xE6, 0x9E, 0x42, 0x1C, 0x48,
1920x1C, 0x69, 0xC4, 0xDA, 0x42, 0x6E, 0xF5, 0x07,
1930xF1, 0x08, 0x00, 0xCB, 0x40, 0xF7, 0x1B, 0xBD,
1940x67, 0xB4, 0xEC, 0x53, 0x14, 0xE9, 0x74, 0xAB,
1950x47, 0x2C, 0x96, 0xB5, 0xBD, 0x22, 0x40, 0xA5,
1960xFD, 0xE1, 0x01, 0x12, 0x99, 0xCC, 0x4A, 0x67,
1970xFC, 0xC9, 0xB0, 0xA5, 0xF4, 0x62, 0x58, 0x44,
1980x84, 0x06, 0x73, 0x5C, 0x6C, 0xDE, 0xC4, 0x92,
1990xE2, 0x59, 0xD9, 0x3D, 0x99, 0x72, 0xFA, 0x49,
2000x24, 0xA2, 0xB5, 0x59, 0xE5, 0x2D, 0x28, 0x55,
2010x54, 0xAF, 0x8A, 0xD2, 0x52, 0x9D, 0xD1, 0x1E,
2020x69, 0x4E, 0x36, 0x89, 0xC5, 0x38, 0xDD, 0xBB,
2030xE8, 0xC7, 0x71, 0x42, 0x63, 0xA5, 0xC4, 0xEB,
2040xEF, 0xFB, 0x83, 0x24, 0x78, 0xA6, 0x4B, 0x86,
2050x26, 0x47, 0x8D, 0xCE, 0xA7, 0x01, 0x6B, 0x11,
2060xFB, 0x76, 0x74, 0xF1, 0xAA, 0x97, 0x94, 0x5A,
2070xC4, 0x7E, 0xDD, 0x9D, 0x3C, 0x6A, 0xA5, 0xE5,
2080x0C, 0xC2, 0x00, 0x33, 0xAC, 0x47, 0xED, 0xD9,
2090xD3, 0xC6, 0xAA, 0x5E, 0x50, 0x67, 0x35, 0xC6,
2100xCD, 0xEC, 0x49, 0x2E, 0x25, 0x9D, 0x93, 0xD9,
2110x97, 0x2F, 0xA4, 0x92, 0x4A, 0x2B, 0x55, 0x9E,
2120x52, 0xD2, 0x85, 0x55, 0x4A, 0xF8, 0xAD, 0x25,
2130x29, 0xDD, 0x11, 0xE6, 0x94, 0xE3, 0x68, 0x9C,
2140x53, 0x8D, 0xDB, 0xBE, 0x8C, 0x77, 0x14, 0x6B,
2150x20, 0x33, 0x32, 0x5C, 0x31, 0x32, 0x3C, 0x6E,
2160x75, 0x38, 0x0C, 0xCD, 0x3E, 0x76, 0x89, 0xBB,
2170x97, 0xF4, 0x3B, 0x4D, 0x5D, 0xD6, 0x86, 0xD4,
2180x5B, 0xAC, 0x9F, 0xC6, 0x90, 0x2F, 0xDA, 0xA9,
2190x59, 0xE9, 0xFC, 0xD1, 0x09, 0x42, 0x8C, 0x0C,
2200xDF, 0xBE, 0x9E, 0xCD, 0xC5, 0x1A, 0x67, 0x58,
2210x8F, 0xDB, 0xB3, 0xA7, 0x8D, 0x54, 0xBC, 0xA3,
2220x8C, 0xFE, 0xD0, 0x76, 0x16, 0xFF, 0x00, 0x76,
2230x0A, 0xAD, 0xAD, 0xE9, 0x66, 0xD1, 0x5A, 0x7D,
2240x52, 0xCF, 0x4E, 0xD5, 0x6A, 0x4E, 0xAC, 0x8B,
2250xD3, 0xA4, 0x4A, 0x14, 0x61, 0x1D, 0xC7, 0x47,
2260x76, 0xCD, 0xE2, 0x7D, 0xAA, 0xAF, 0xD9, 0xDA,
2270xBB, 0x09, 0x5D, 0xB5, 0xD7, 0xB5, 0xEB, 0x77,
2280x54, 0xF5, 0x4D, 0x12, 0x52, 0x43, 0x59, 0x58,
2290x9D, 0x1A, 0x2F, 0x4F, 0x9D, 0x08, 0x53, 0x8E,
2300xE2, 0xC6, 0x10, 0xF7, 0x80, 0xEC, 0xF5, 0x88,
2310xFD, 0xBB, 0x3A, 0x78, 0xD5, 0x4B, 0xCA, 0x2D,
2320x62, 0x3F, 0x6E, 0xCE, 0x9E, 0x35, 0x52, 0xF2,
2330x8C, 0x67, 0xCA, 0x8D, 0xFB, 0x7B, 0x73, 0xDD,
2340x2A, 0x5F, 0x04, 0x5C, 0xA8, 0xDF, 0xB7, 0xB7,
2350x3D, 0xD2, 0xA5, 0xF0, 0x40, 0x6C, 0xCD, 0x62,
2360x3F, 0x6E, 0xCE, 0x9E, 0x35, 0x52, 0xF2, 0x8B,
2370x58, 0x8F, 0xDB, 0xB3, 0xA7, 0x8D, 0x54, 0xBC,
2380xA3, 0x33, 0x3B, 0x27, 0xA5, 0x3B, 0x17, 0x95,
2390x78, 0x68, 0x54, 0xBB, 0x7A, 0xDD, 0xD5, 0x56,
2400xBE, 0xA9, 0x25, 0xA1, 0xAB, 0xAC, 0xA7, 0x43,
2410xE7, 0x4C, 0x36, 0x31, 0xA0, 0x7E, 0xE8, 0xC2,
2420x1B, 0x7E, 0x81, 0xD9, 0xFC, 0xBB, 0x3F, 0x77,
2430x28, 0x06, 0x6D, 0x62, 0x3F, 0x6E, 0xCE, 0x9E,
2440x35, 0x52, 0xF2, 0x83, 0x39, 0xAE, 0x36, 0x6F,
2450x62, 0x49, 0x71, 0x2C, 0xEC, 0x9E, 0xCC, 0xB9,
2460x7D, 0x24, 0x92, 0x51, 0x5A, 0xAC, 0xF2, 0x96,
2470x94, 0x2A, 0xAA, 0x57, 0xC5, 0x69, 0x29, 0x4E,
2480xE8, 0x8F, 0x34, 0xA7, 0x1B, 0x44, 0xE2, 0x9C,
2490x6E, 0xDD, 0xF4, 0x63, 0xB8, 0xA3, 0xC5, 0xF9,
2500x76, 0x7E, 0xEE, 0x51, 0xC6, 0x39, 0x2E, 0x56,
2510x3A, 0xB0, 0x92, 0x35, 0x69, 0xFE, 0x53, 0xE9,
2520xAC, 0x1F, 0xE1, 0x7F, 0xEB, 0xA4, 0xAC, 0xF9,
2530xFE, 0x93, 0xE7, 0x2B, 0x3D, 0x2F, 0xFA, 0xD9,
2540x00, 0x1B, 0xFC, 0x42, 0x10, 0x0C, 0x9A, 0xD4,
2550xBE, 0x39, 0x09, 0xCF, 0xBF, 0x67, 0xD5, 0x28,
2560x4A, 0x08, 0x6D, 0xF2, 0xB2, 0xE5, 0xC3, 0x76,
2570xC9, 0xB4, 0x8F, 0x47, 0x6B, 0xA0, 0xAA, 0x42,
2580x25, 0xE9, 0x48, 0x8C, 0xF3, 0x4C, 0xA0, 0x6A,
2590x42, 0x1D, 0xCE, 0x84, 0x61, 0x02, 0x6D, 0xDC,
2600x64, 0xE4, 0xA7, 0x5B, 0xAB, 0x57, 0x61, 0x24,
2610x31, 0x5A, 0x05, 0x7A, 0xDD, 0xD5, 0xDD, 0x6E,
2620xF7, 0xA9, 0xAC, 0xAC, 0x4E, 0x91, 0x2F, 0xA1,
2630x52, 0x74, 0x21, 0x4E, 0x1B, 0xCB, 0x18, 0x47,
2640xDC, 0x34, 0xCC, 0xF6, 0xB0, 0xC4, 0xD7, 0x70,
2650x59, 0xD4, 0x02, 0x99, 0x2E, 0x18, 0x99, 0x1E,
2660x37, 0x3A, 0x9C, 0x00, 0xCF, 0x2E, 0x7F, 0xB2,
2670xEE, 0xFF, 0x00, 0xFD, 0x38, 0xB9, 0x73, 0xFD,
2680x97, 0x77, 0xFF, 0x00, 0xE9, 0xC6, 0xCC, 0x10,
2690x0C, 0x67, 0xCB, 0x9F, 0xEC, 0xBB, 0xBF, 0xFF,
2700x00, 0x4E, 0x38, 0xC7, 0x25, 0x3A, 0xDD, 0x5A,
2710xBB, 0x09, 0x21, 0x8A, 0xD0, 0x2B, 0xD6, 0xEE,
2720xAE, 0xEB, 0x77, 0xBD, 0x4D, 0x65, 0x62, 0x74,
2730x89, 0x7D, 0x0A, 0x93, 0xA1, 0x0A, 0x70, 0xDE,
2740x58, 0xC2, 0x3E, 0xE1, 0xBF, 0xC0, 0xCC, 0xC9,
2750x70, 0xC4, 0xC8, 0xF1, 0xB9, 0xD4, 0xE0, 0x33,
2760x33, 0xED, 0x9D, 0x6E, 0xB2, 0x9D, 0x84, 0xAE,
2770xC5, 0x68, 0x15, 0xD5, 0x78, 0xD4, 0xF5, 0xBB,
2780xDE, 0xBA, 0xAE, 0xAD, 0x3A, 0x34, 0xBE, 0x85,
2790x49, 0xB1, 0x8D, 0x08, 0x6F, 0x24, 0x23, 0x1F,
2800x70, 0x9F, 0x6C, 0xEB, 0x75, 0x94, 0xEC, 0x25,
2810x76, 0x2B, 0x40, 0xAE, 0xAB, 0xC6, 0xA7, 0xAD,
2820xDE, 0xF5, 0xD5, 0x75, 0x69, 0xD1, 0xA5, 0xF4,
2830x2A, 0x4D, 0x8C, 0x68, 0x43, 0x79, 0x21, 0x18,
2840xFB, 0x86, 0x99, 0x9E, 0xD6, 0x18, 0x9A, 0xEE,
2850x0B, 0x3A, 0x80, 0x53, 0xDA, 0xC3, 0x13, 0x5D,
2860xC1, 0x67, 0x50, 0x00, 0xCC, 0xCE, 0x4A, 0x75,
2870xBA, 0xB5, 0x76, 0x12, 0x43, 0x15, 0xA0, 0x57,
2880xAD, 0xDD, 0x5D, 0xD6, 0xEF, 0x7A, 0x9A, 0xCA,
2890xC4, 0xE9, 0x12, 0xFA, 0x15, 0x27, 0x42, 0x14,
2900xE1, 0xBC, 0xB1, 0x84, 0x7D, 0xC3, 0xB3, 0xE5,
2910xCF, 0xF6, 0x5D, 0xDF, 0xFF, 0x00, 0xA7, 0x0C,
2920xD3, 0x25, 0xC3, 0x13, 0x23, 0xC6, 0xE7, 0x53,
2930x86, 0x60, 0x18, 0x01, 0x92, 0x9D, 0x6D, 0xC0,
2940xF3, 0xDB, 0x76, 0xD7, 0x40, 0xAD, 0x3A, 0x55,
2950x60, 0xEA, 0x97, 0xBD, 0x0B, 0x2D, 0x95, 0x01,
2960x51, 0x7A, 0x75, 0x25, 0xA7, 0x4A, 0x31, 0xDC,
2970x6C, 0x37, 0x6D, 0xDE, 0x3B, 0x3E, 0x5C, 0xFF,
2980x00, 0x65, 0xDD, 0xFF, 0x00, 0xFA, 0x70, 0xCC,
2990xE9, 0x71, 0x3A, 0xFB, 0xFE, 0xE0, 0xC9, 0x1E,
3000x19, 0x80, 0x63, 0x3E, 0x5C, 0xFF, 0x00, 0x65,
3010xDD, 0xFF, 0x00, 0xFA, 0x71, 0xC6, 0x39, 0x29,
3020xD6, 0xEA, 0xD5, 0xD8, 0x49, 0x0C, 0x56, 0x81,
3030x5E, 0xB7, 0x75, 0x77, 0x5B, 0xBD, 0xEA, 0x6B,
3040x2B, 0x13, 0xA4, 0x4B, 0xE8, 0x54, 0x9D, 0x08,
3050x53, 0x86, 0xF2, 0xC6, 0x11, 0xF7, 0x0D, 0xFE,
3060x06, 0x66, 0x4B, 0x86, 0x26, 0x47, 0x8D, 0xCE,
3070xA7, 0x00, 0xCC, 0x21, 0x08, 0x00, 0xCC, 0xF6,
3080xB0, 0xC4, 0xD7, 0x70, 0x59, 0xD4, 0x02, 0x99,
3090x2E, 0x18, 0x99, 0x1E, 0x37, 0x3A, 0x9C, 0x53,
3100xDA, 0xC3, 0x13, 0x5D, 0xC1, 0x67, 0x50, 0x0A,
3110x64, 0xB8, 0x62, 0x64, 0x78, 0xDC, 0xEA, 0x70,
3120x0C, 0xC2, 0x10, 0x80, 0x40, 0x66, 0x64, 0xB8,
3130x62, 0x64, 0x78, 0xDC, 0xEA, 0x70, 0xCC, 0x06,
3140x66, 0x4B, 0x86, 0x26, 0x47, 0x8D, 0xCE, 0xA7,
3150x01, 0x4F, 0x6B, 0x0C, 0x4D, 0x77, 0x05, 0x9D,
3160x40, 0x29, 0xED, 0x61, 0x89, 0xAE, 0xE0, 0xB3,
3170xA8, 0x05, 0x3D, 0xAC, 0x31, 0x35, 0xDC, 0x16,
3180x75, 0x00, 0xA7, 0xB5, 0x86, 0x26, 0xBB, 0x82,
3190xCE, 0xA0, 0x01, 0x4C, 0x97, 0x0C, 0x4C, 0x8F,
3200x1B, 0x9D, 0x4E, 0x19, 0x86, 0x4D, 0x9A, 0xE3,
3210xFB, 0x74, 0xEC, 0x5B, 0x89, 0x67, 0x59, 0x96,
3220x99, 0xAB, 0xB0, 0x4A, 0xCA, 0x76, 0xAB, 0x42,
3230xBD, 0xDE, 0xB4, 0x92, 0x85, 0x35, 0xA4, 0xA7,
3240x9B, 0xCE, 0x31, 0x19, 0x4D, 0x2C, 0x4D, 0x38,
3250xD2, 0xEC, 0x29, 0x77, 0xFA, 0xC2, 0x67, 0x2A,
3260x37, 0x13, 0xED, 0xCF, 0x74, 0xAE, 0xFC, 0x10,
3270x03, 0x33, 0x80, 0xFA, 0xCE, 0xFE, 0x13, 0xFC,
3280xB0, 0xCD, 0x32, 0x5C, 0x31, 0x32, 0x3C, 0x6E,
3290x75, 0x38, 0x00, 0x79, 0x2D, 0x4C, 0x84, 0xDA,
3300x33, 0x13, 0x91, 0x69, 0x99, 0x95, 0xEB, 0x7C,
3310x92, 0xB9, 0xA2, 0xF6, 0x75, 0x8A, 0xA3, 0xD1,
3320xD3, 0xA0, 0x79, 0xA6, 0x1D, 0xCD, 0x3C, 0x84,
3330x38, 0x90, 0x38, 0xD3, 0x89, 0xB4, 0x84, 0xDD,
3340xEA, 0x0F, 0xF3, 0x25, 0xC3, 0x13, 0x23, 0xC6,
3350xE7, 0x53, 0x80, 0x66, 0x03, 0x33, 0x25, 0xC3,
3360x13, 0x23, 0xC6, 0xE7, 0x53, 0x86, 0x60, 0x33,
3370x32, 0x5C, 0x31, 0x32, 0x3C, 0x6E, 0x75, 0x38,
3380x06, 0x61, 0x08, 0x40, 0x06, 0x67, 0xB5, 0x86,
3390x26, 0xBB, 0x82, 0xCE, 0xA0, 0x14, 0xC9, 0x70,
3400xC4, 0xC8, 0xF1, 0xB9, 0xD4, 0xE2, 0x9E, 0xD6,
3410x18, 0x9A, 0xEE, 0x0B, 0x3A, 0x80, 0x53, 0x25,
3420xC3, 0x13, 0x23, 0xC6, 0xE7, 0x53, 0x80, 0x66,
3430x10, 0x84, 0x02, 0x03, 0x33, 0x25, 0xC3, 0x13,
3440x23, 0xC6, 0xE7, 0x53, 0x86, 0x60, 0x33, 0x32,
3450x5C, 0x31, 0x32, 0x3C, 0x6E, 0x75, 0x38, 0x0A,
3460x7B, 0x58, 0x62, 0x6B, 0xB8, 0x2C, 0xEA, 0x01,
3470x4F, 0x6B, 0x0C, 0x4D, 0x77, 0x05, 0x9D, 0x40,
3480x29, 0xED, 0x61, 0x89, 0xAE, 0xE0, 0xB3, 0xA8,
3490x05, 0x3D, 0xAC, 0x31, 0x35, 0xDC, 0x16, 0x75,
3500x00, 0x06, 0x61, 0x08, 0x40, 0x31, 0x9C, 0xEB,
3510x65, 0x86, 0xEE, 0x5F, 0xD7, 0x2C, 0x93, 0xA6,
3520x36, 0x66, 0x4D, 0x95, 0xB8, 0xFF, 0x00, 0x82,
3530xDD, 0x88, 0x0F, 0xB5, 0x5A, 0xAA, 0x4E, 0xF9,
3540xF8, 0x11, 0x21, 0x94, 0x52, 0x12, 0x9E, 0xF3,
3550xA3, 0xBB, 0x61, 0x07, 0xB5, 0x35, 0xC6, 0x31,
3560xEC, 0x4A, 0xCE, 0x25, 0x9D, 0x94, 0x19, 0x97,
3570xD1, 0xA3, 0x72, 0x4A, 0x5B, 0x55, 0x9E, 0x4D,
3580xD1, 0x75, 0x55, 0xBA, 0x88, 0x2D, 0x25, 0x21,
3590xDD, 0x29, 0xE7, 0x10, 0xE3, 0xA9, 0x1C, 0x43,
3600x8E, 0xDB, 0xBA, 0x94, 0x37, 0x10, 0x78, 0xB3,
3610x80, 0xFA, 0xCE, 0xFE, 0x13, 0xFC, 0xB0, 0xCD,
3620x32, 0x5C, 0x31, 0x32, 0x3C, 0x6E, 0x75, 0x38,
3630x0B, 0x57, 0x6F, 0xDB, 0xB4, 0x5F, 0x82, 0x94,
3640xBC, 0xC0, 0xCE, 0x6B, 0x8C, 0x63, 0xD8, 0x95,
3650x9C, 0x4B, 0x3B, 0x28, 0x33, 0x2F, 0xA3, 0x46,
3660xE4, 0x94, 0xB6, 0xAB, 0x3C, 0x9B, 0xA2, 0xEA,
3670xAB, 0x75, 0x10, 0x5A, 0x4A, 0x43, 0xBA, 0x53,
3680xCE, 0x21, 0xC7, 0x52, 0x38, 0x87, 0x1D, 0xB7,
3690x75, 0x28, 0x6E, 0x20, 0xD6, 0x40, 0x66, 0x64,
3700xB8, 0x62, 0x64, 0x78, 0xDC, 0xEA, 0x70, 0x16,
3710xB1, 0x1F, 0xB7, 0x67, 0x4F, 0x1A, 0xA9, 0x79,
3720x45, 0xAC, 0x47, 0xED, 0xD9, 0xD3, 0xC6, 0xAA,
3730x5E, 0x50, 0xCC, 0x20, 0x19, 0x36, 0x74, 0x6D,
3740x9B, 0xD8, 0x95, 0x9C, 0x4B, 0x45, 0x27, 0xB4,
3750xCE, 0x5F, 0x46, 0xE4, 0x94, 0xB6, 0x5B, 0x44,
3760xA5, 0xA5, 0x0A, 0xAB, 0x75, 0x10, 0x5A, 0x44,
3770x53, 0x7A, 0x23, 0x0D, 0x21, 0xC7, 0x52, 0x38,
3780x86, 0x9B, 0xB3, 0x75, 0x28, 0xEE, 0x20, 0xA6,
3790xB8, 0xD9, 0xBD, 0x89, 0x25, 0xC4, 0xB3, 0xB2,
3800x7B, 0x32, 0xE5, 0xF4, 0x92, 0x49, 0x45, 0x6A,
3810xB3, 0xCA, 0x5A, 0x50, 0xAA, 0xA9, 0x5F, 0x15,
3820xA4, 0xA5, 0x3B, 0xA2, 0x3C, 0xD2, 0x9C, 0x6D,
3830x13, 0x8A, 0x71, 0xBB, 0x77, 0xD1, 0x8E, 0xE2,
3840x84, 0xC9, 0xED, 0x61, 0x89, 0xAE, 0xE0, 0xB3,
3850xA8, 0x05, 0x32, 0x5C, 0x31, 0x32, 0x3C, 0x6E,
3860x75, 0x38, 0x0B, 0x58, 0x8F, 0xDB, 0xB3, 0xA7,
3870x8D, 0x54, 0xBC, 0xA2, 0xD6, 0x23, 0xF6, 0xEC,
3880xE9, 0xE3, 0x55, 0x2F, 0x28, 0x66, 0x10, 0x01,
3890x9D, 0x62, 0x3F, 0x6E, 0xCE, 0x9E, 0x35, 0x52,
3900xF2, 0x8F, 0x6A, 0x6B, 0x8C, 0xB4, 0xBA, 0xC5,
3910xB8, 0x96, 0x75, 0x99, 0x69, 0x94, 0x6C, 0x12,
3920xB2, 0x9D, 0xAA, 0xD0, 0xAF, 0x5A, 0x62, 0x4A,
3930x14, 0xD6, 0x92, 0x9E, 0x6F, 0x38, 0xC2, 0x94,
3940xD2, 0xC4, 0xD3, 0x8D, 0x2E, 0xC2, 0x97, 0x7F,
3950xAC, 0x26, 0x08, 0x00, 0xCC, 0xF6, 0xB0, 0xC4,
3960xD7, 0x70, 0x59, 0xD4, 0x02, 0x9E, 0xD6, 0x18,
3970x9A, 0xEE, 0x0B, 0x3A, 0x80, 0x53, 0xDA, 0xC3,
3980x13, 0x5D, 0xC1, 0x67, 0x50, 0x0A, 0x7B, 0x58,
3990x62, 0x6B, 0xB8, 0x2C, 0xEA, 0x00, 0x0C, 0xC2,
4000x10, 0x80, 0x63, 0x39, 0xC0, 0x7D, 0x67, 0x7F,
4010x09, 0xFE, 0x58, 0x66, 0x99, 0x2E, 0x18, 0x99,
4020x1E, 0x37, 0x3A, 0x9C, 0x0C, 0xCE, 0x03, 0xEB,
4030x3B, 0xF8, 0x4F, 0xF2, 0xC3, 0x34, 0xC9, 0x70,
4040xC4, 0xC8, 0xF1, 0xB9, 0xD4, 0xE0, 0x19, 0x80,
4050xCC, 0xC9, 0x70, 0xC4, 0xC8, 0xF1, 0xB9, 0xD4,
4060xE1, 0x98, 0x0C, 0xCC, 0x97, 0x0C, 0x4C, 0x8F,
4070x1B, 0x9D, 0x4E, 0x03, 0xFF, 0xD9};
408static const int goodJpegImageWidth = 128;
409static const int goodJpegImageHeight = 128;
410
411// https://code.google.com/p/android/issues/detail?id=42382
412// https://code.google.com/p/android/issues/detail?id=9064
413// https://code.google.com/p/skia/issues/detail?id=1649
414
415/**
416  This test will test the ability of the SkImageDecoder to deal with
417  Jpeg files which have been mangled somehow.  We want to display as
418  much of the jpeg as possible.
419*/
420DEF_TEST(Jpeg, reporter) {
421    size_t len = sizeof(goodJpegImage) / 2;
422    // I am explicitly not putting the entire image into the
423    // DecodeMemory.  This simulates a network error.
424
425    SkBitmap bm8888;
426    bool imageDecodeSuccess = SkImageDecoder::DecodeMemory(
427        static_cast<void *>(goodJpegImage), len, &bm8888);
428    REPORTER_ASSERT(reporter, imageDecodeSuccess);
429    REPORTER_ASSERT(reporter, bm8888.width() == goodJpegImageWidth);
430    REPORTER_ASSERT(reporter, bm8888.height() == goodJpegImageHeight);
431    REPORTER_ASSERT(reporter, !(bm8888.empty()));
432
433    // Pick a few pixels and verify that their colors match the colors
434    // we expect (given the original image).
435    REPORTER_ASSERT(reporter, bm8888.getColor(7, 9) == 0xffffffff);
436    REPORTER_ASSERT(reporter, bm8888.getColor(28, 3) == 0xff000000);
437    REPORTER_ASSERT(reporter, bm8888.getColor(27, 34) == 0xffffffff);
438    REPORTER_ASSERT(reporter, bm8888.getColor(71, 18) == 0xff000000);
439
440#ifdef SK_BUILD_FOR_IOS  // the iOS jpeg decoder fills to gray
441    REPORTER_ASSERT(reporter, bm8888.getColor(127, 127) == 0xff808080
442            || bm8888.getColor(127, 127) == SK_ColorWHITE);
443#else
444    // This is the fill color
445    REPORTER_ASSERT(reporter, bm8888.getColor(127, 127) == SK_ColorWHITE);
446#endif
447
448    #if JPEG_TEST_WRITE_TO_FILE_FOR_DEBUGGING
449    // Check to see that the resulting bitmap is nice
450    bool writeSuccess = (!(bm8888.empty())) && SkImageEncoder::EncodeFile(
451        "HalfOfAJpeg.png", bm8888, SkImageEncoder::kPNG_Type, 100);
452    SkASSERT(writeSuccess);
453    #endif
454}
455