blob: 1e7499a513f4fab99bc8b9ce44a1d56b85680e77 [file] [log] [blame]
halcanary@google.comfed30372013-10-04 12:46:45 +00001/*
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"
msarettb714fb02016-01-22 14:46:42 -08009#include "SkCodec.h"
sugoib227e372014-10-16 13:10:57 -070010#include "SkDecodingImageGenerator.h"
halcanary@google.comfed30372013-10-04 12:46:45 +000011#include "SkForceLinking.h"
tfarina@chromium.org8f6884a2014-01-24 20:56:26 +000012#include "SkImageDecoder.h"
sugoib227e372014-10-16 13:10:57 -070013#include "SkPixelRef.h"
msarettb714fb02016-01-22 14:46:42 -080014#include "Resources.h"
halcanary@google.comfed30372013-10-04 12:46:45 +000015#include "SkStream.h"
sugoib227e372014-10-16 13:10:57 -070016#include "SkTemplates.h"
tfarina@chromium.org8f6884a2014-01-24 20:56:26 +000017#include "Test.h"
halcanary@google.comfed30372013-10-04 12:46:45 +000018
19__SK_FORCE_IMAGE_DECODER_LINKING;
20
21#define JPEG_TEST_WRITE_TO_FILE_FOR_DEBUGGING 0 // do not do this for
22 // normal unit testing.
commit-bot@chromium.orgddf94cf2013-10-12 17:25:17 +000023static unsigned char goodJpegImage[] = {
240xFF, 0xD8, 0xFF, 0xE0, 0x00, 0x10, 0x4A, 0x46,
250x49, 0x46, 0x00, 0x01, 0x01, 0x01, 0x00, 0x8F,
260x00, 0x8F, 0x00, 0x00, 0xFF, 0xDB, 0x00, 0x43,
270x00, 0x05, 0x03, 0x04, 0x04, 0x04, 0x03, 0x05,
280x04, 0x04, 0x04, 0x05, 0x05, 0x05, 0x06, 0x07,
290x0C, 0x08, 0x07, 0x07, 0x07, 0x07, 0x0F, 0x0B,
300x0B, 0x09, 0x0C, 0x11, 0x0F, 0x12, 0x12, 0x11,
310x0F, 0x11, 0x11, 0x13, 0x16, 0x1C, 0x17, 0x13,
320x14, 0x1A, 0x15, 0x11, 0x11, 0x18, 0x21, 0x18,
330x1A, 0x1D, 0x1D, 0x1F, 0x1F, 0x1F, 0x13, 0x17,
340x22, 0x24, 0x22, 0x1E, 0x24, 0x1C, 0x1E, 0x1F,
350x1E, 0xFF, 0xDB, 0x00, 0x43, 0x01, 0x05, 0x05,
360x05, 0x07, 0x06, 0x07, 0x0E, 0x08, 0x08, 0x0E,
370x1E, 0x14, 0x11, 0x14, 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, 0x1E, 0x1E,
410x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E,
420x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E,
430x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0xFF, 0xC0,
440x00, 0x11, 0x08, 0x00, 0x80, 0x00, 0x80, 0x03,
450x01, 0x22, 0x00, 0x02, 0x11, 0x01, 0x03, 0x11,
460x01, 0xFF, 0xC4, 0x00, 0x18, 0x00, 0x01, 0x01,
470x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
480x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00,
490x08, 0x06, 0x05, 0xFF, 0xC4, 0x00, 0x4C, 0x10,
500x00, 0x00, 0x01, 0x07, 0x08, 0x05, 0x08, 0x05,
510x0A, 0x03, 0x09, 0x01, 0x00, 0x00, 0x00, 0x00,
520x00, 0x01, 0x02, 0x03, 0x04, 0x06, 0x07, 0x11,
530x05, 0x08, 0x12, 0x13, 0x14, 0x15, 0x38, 0xB4,
540x16, 0x17, 0x21, 0x31, 0x84, 0x18, 0x22, 0x23,
550x24, 0x58, 0xA5, 0xA6, 0xD2, 0x32, 0x51, 0x56,
560x61, 0xD3, 0x28, 0x33, 0x41, 0x48, 0x67, 0x85,
570x86, 0xC3, 0xE4, 0xF0, 0x25, 0x49, 0x55, 0x09,
580x34, 0x35, 0x36, 0x53, 0x68, 0x72, 0x81, 0xA7,
590xE2, 0xFF, 0xC4, 0x00, 0x14, 0x01, 0x01, 0x00,
600x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
610x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF,
620xC4, 0x00, 0x14, 0x11, 0x01, 0x00, 0x00, 0x00,
630x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
640x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xDA, 0x00,
650x0C, 0x03, 0x01, 0x00, 0x02, 0x11, 0x03, 0x11,
660x00, 0x3F, 0x00, 0xD9, 0x62, 0x10, 0x80, 0x40,
670x65, 0xED, 0x62, 0x75, 0xC8, 0x7D, 0xFF, 0x00,
680x92, 0x30, 0x33, 0x01, 0x97, 0xB5, 0x89, 0xD7,
690x21, 0xF7, 0xFE, 0x48, 0xC0, 0x0C, 0xC2, 0x10,
700x80, 0x40, 0x66, 0x64, 0xB8, 0x62, 0x64, 0x78,
710xDC, 0xEA, 0x70, 0xCC, 0x06, 0x66, 0x4B, 0x86,
720x26, 0x47, 0x8D, 0xCE, 0xA7, 0x00, 0xCC, 0x21,
730x08, 0x04, 0x31, 0x9F, 0xF2, 0xC5, 0xFD, 0xFF,
740x00, 0x5A, 0x1B, 0x30, 0x63, 0x3F, 0xE5, 0x8B,
750xFB, 0xFE, 0xB4, 0x03, 0x66, 0x01, 0x99, 0x92,
760xE1, 0x89, 0x91, 0xE3, 0x73, 0xA9, 0xC3, 0x30,
770x19, 0x99, 0x2E, 0x18, 0x99, 0x1E, 0x37, 0x3A,
780x9C, 0x03, 0x30, 0x84, 0x33, 0x33, 0x92, 0x55,
790x7E, 0xCF, 0x29, 0xD8, 0x49, 0x0D, 0xAE, 0xBD,
800xAE, 0xAB, 0xC6, 0xBB, 0xAA, 0x68, 0x92, 0x92,
810x6A, 0xBA, 0xB4, 0xE9, 0x11, 0x7A, 0x7C, 0xD8,
820xC6, 0x84, 0x77, 0x12, 0x11, 0x87, 0xBC, 0x07,
830x67, 0xAC, 0x47, 0xED, 0xD9, 0xD3, 0xC6, 0xAA,
840x5E, 0x51, 0x6B, 0x11, 0xFB, 0x76, 0x74, 0xF1,
850xAA, 0x97, 0x94, 0x33, 0x08, 0x00, 0xCE, 0xB1,
860x1F, 0xB7, 0x67, 0x4F, 0x1A, 0xA9, 0x79, 0x41,
870x9B, 0xC4, 0x6C, 0xDE, 0xC2, 0xCB, 0xF6, 0x75,
880x92, 0x84, 0xA0, 0xE5, 0xEC, 0x12, 0xB2, 0x9D,
890xEF, 0x76, 0xC9, 0xBA, 0x50, 0xAA, 0x92, 0xF1,
900xA6, 0xAA, 0x69, 0x12, 0xF4, 0xA4, 0x36, 0x8A,
910x2A, 0xB3, 0x60, 0x77, 0x3A, 0x34, 0xA3, 0x02,
920x6D, 0x1A, 0xC8, 0x0C, 0xBD, 0xAC, 0x4E, 0xB9,
930x0F, 0xBF, 0xF2, 0x46, 0x00, 0xB5, 0x88, 0xFD,
940xBB, 0x3A, 0x78, 0xD5, 0x4B, 0xCA, 0x2D, 0x62,
950x3F, 0x6E, 0xCE, 0x9E, 0x35, 0x52, 0xF2, 0x86,
960x61, 0x00, 0x19, 0xD6, 0x23, 0xF6, 0xEC, 0xE9,
970xE3, 0x55, 0x2F, 0x28, 0x33, 0x9A, 0xE3, 0x66,
980xF6, 0x24, 0x97, 0x12, 0xCE, 0xC9, 0xEC, 0xCB,
990x97, 0xD2, 0x49, 0x25, 0x15, 0xAA, 0xCF, 0x29,
1000x69, 0x42, 0xAA, 0xA5, 0x7C, 0x56, 0x92, 0x94,
1010xEE, 0x88, 0xF3, 0x4A, 0x71, 0xB4, 0x4E, 0x29,
1020xC6, 0xED, 0xDF, 0x46, 0x3B, 0x8A, 0x35, 0x90,
1030x19, 0x99, 0x2E, 0x18, 0x99, 0x1E, 0x37, 0x3A,
1040x9C, 0x01, 0x9B, 0xE4, 0x79, 0x73, 0x93, 0x59,
1050x69, 0xD9, 0x36, 0x65, 0x99, 0x62, 0x34, 0x1E,
1060x56, 0x95, 0xAD, 0x96, 0x75, 0x7B, 0xD6, 0x4F,
1070x94, 0x6F, 0x1A, 0xA3, 0x0C, 0x3C, 0xEE, 0x71,
1080xE6, 0x51, 0x45, 0x56, 0x6D, 0x22, 0xED, 0x29,
1090x29, 0x53, 0xFA, 0x4A, 0x41, 0xE2, 0xFC, 0xBB,
1100x3F, 0x77, 0x28, 0x66, 0x7B, 0x58, 0x9D, 0x72,
1110x1F, 0x7F, 0xE4, 0x8C, 0x0C, 0xC0, 0x31, 0x9F,
1120xCB, 0xB3, 0xF7, 0x72, 0x8F, 0x19, 0xB6, 0x76,
1130x8F, 0x61, 0x8B, 0x99, 0xDA, 0xDA, 0x16, 0x99,
1140xB7, 0xB0, 0x49, 0x2A, 0x74, 0x2D, 0x0C, 0x9D,
1150xD4, 0xAA, 0x92, 0x85, 0x39, 0x40, 0xD2, 0x9B,
1160xD7, 0x0C, 0x3C, 0xA7, 0x16, 0x27, 0x1C, 0x6A,
1170x5D, 0x91, 0xDF, 0x43, 0x70, 0xDC, 0xA2, 0x01,
1180x8C, 0xF5, 0xC1, 0xFE, 0xF1, 0x3F, 0xF3, 0x4F,
1190xFE, 0x07, 0xB5, 0x35, 0xC6, 0x31, 0xEC, 0x4A,
1200xCE, 0x25, 0x9D, 0x94, 0x19, 0x97, 0xD1, 0xA3,
1210x72, 0x4A, 0x5B, 0x55, 0x9E, 0x4D, 0xD1, 0x75,
1220x55, 0xBA, 0x88, 0x2D, 0x25, 0x21, 0xDD, 0x29,
1230xE7, 0x10, 0xE3, 0xA9, 0x1C, 0x43, 0x8E, 0xDB,
1240xBA, 0x94, 0x37, 0x10, 0x6B, 0x21, 0x00, 0x19,
1250xD5, 0xDB, 0xF6, 0xED, 0x17, 0xE0, 0xA5, 0x2F,
1260x30, 0x33, 0x9A, 0xE3, 0x18, 0xF6, 0x25, 0x67,
1270x12, 0xCE, 0xCA, 0x0C, 0xCB, 0xE8, 0xD1, 0xB9,
1280x25, 0x2D, 0xAA, 0xCF, 0x26, 0xE8, 0xBA, 0xAA,
1290xDD, 0x44, 0x16, 0x92, 0x90, 0xEE, 0x94, 0xF3,
1300x88, 0x71, 0xD4, 0x8E, 0x21, 0xC7, 0x6D, 0xDD,
1310x4A, 0x1B, 0x88, 0x35, 0x90, 0x19, 0x99, 0x2E,
1320x18, 0x99, 0x1E, 0x37, 0x3A, 0x9C, 0x03, 0x30,
1330x80, 0x04, 0xDB, 0x99, 0x69, 0x09, 0x8B, 0x7E,
1340xCF, 0x8D, 0x99, 0x66, 0x54, 0x6C, 0x12, 0x4A,
1350x9D, 0xC7, 0x67, 0x57, 0xAD, 0x3D, 0x25, 0x0A,
1360x6A, 0xA9, 0x4F, 0x3B, 0x9C, 0x79, 0x4A, 0x71,
1370x62, 0x71, 0xC7, 0x17, 0x69, 0x4B, 0xBF, 0xD4,
1380x1F, 0xC0, 0x43, 0x8C, 0x79, 0xAE, 0xB5, 0x84,
1390x79, 0x57, 0x7E, 0x9A, 0xC8, 0x57, 0xAD, 0xDD,
1400x5B, 0x64, 0xEB, 0x69, 0xD0, 0xD5, 0xD6, 0x50,
1410xA7, 0xF3, 0x47, 0x9B, 0x18, 0xD0, 0x33, 0x7C,
1420x61, 0x0D, 0x9F, 0x48, 0xEC, 0xC0, 0x03, 0x12,
1430xFB, 0x5E, 0xC3, 0x68, 0xCC, 0x2A, 0x34, 0xCC,
1440xCB, 0x83, 0xB7, 0xC9, 0x2B, 0x94, 0xEC, 0xEB,
1450x1A, 0x5E, 0xAA, 0x8E, 0x9D, 0x03, 0xCE, 0x30,
1460xEE, 0x69, 0xE8, 0xC8, 0x71, 0x20, 0x71, 0xA7,
1470x13, 0x69, 0x09, 0xBB, 0xD4, 0x03, 0xD9, 0xE4,
1480xB8, 0xE2, 0x7D, 0x86, 0xEF, 0x65, 0xDF, 0x8C,
1490x2E, 0x4B, 0x8E, 0x27, 0xD8, 0x6E, 0xF6, 0x5D,
1500xF8, 0xC2, 0xD6, 0x23, 0xF6, 0xEC, 0xE9, 0xE3,
1510x55, 0x2F, 0x28, 0xB5, 0x88, 0xFD, 0xBB, 0x3A,
1520x78, 0xD5, 0x4B, 0xCA, 0x02, 0xE4, 0xB8, 0xE2,
1530x7D, 0x86, 0xEF, 0x65, 0xDF, 0x8C, 0x0C, 0xE6,
1540xB8, 0xE1, 0x1D, 0x3B, 0x68, 0xE2, 0x59, 0xD6,
1550x99, 0xA6, 0x65, 0x2D, 0xF2, 0xB2, 0xE5, 0xAA,
1560xD0, 0xB1, 0x78, 0x2D, 0x23, 0xA7, 0x41, 0x69,
1570x29, 0x86, 0xF3, 0x4C, 0x48, 0x43, 0x49, 0x03,
1580x4D, 0x34, 0x9B, 0x08, 0x4D, 0xDE, 0xB0, 0x99,
1590xAC, 0x47, 0xED, 0xD9, 0xD3, 0xC6, 0xAA, 0x5E,
1600x50, 0x67, 0x35, 0xC6, 0xCD, 0xEC, 0x49, 0x2E,
1610x25, 0x9D, 0x93, 0xD9, 0x97, 0x2F, 0xA4, 0x92,
1620x4A, 0x2B, 0x55, 0x9E, 0x52, 0xD2, 0x85, 0x55,
1630x4A, 0xF8, 0xAD, 0x25, 0x29, 0xDD, 0x11, 0xE6,
1640x94, 0xE3, 0x68, 0x9C, 0x53, 0x8D, 0xDB, 0xBE,
1650x8C, 0x77, 0x14, 0x04, 0xF1, 0x1C, 0x23, 0xA7,
1660x92, 0x5F, 0xB3, 0xAC, 0x66, 0x64, 0xF6, 0x52,
1670xA6, 0x49, 0x97, 0xAF, 0x7B, 0xC9, 0x5E, 0xF0,
1680x5A, 0x3A, 0xBE, 0xA1, 0x54, 0xD3, 0xD1, 0x73,
1690x8A, 0x90, 0xA7, 0x1B, 0x44, 0xE2, 0x94, 0xBC,
1700xD2, 0x92, 0x3F, 0x4C, 0x48, 0x13, 0x39, 0x2E,
1710x38, 0x9F, 0x61, 0xBB, 0xD9, 0x77, 0xE3, 0x01,
1720x97, 0xF4, 0xF7, 0x1B, 0xB6, 0x51, 0xE7, 0xBB,
1730x76, 0xD5, 0xB5, 0x74, 0xB7, 0x15, 0xCD, 0x7A,
1740x59, 0x15, 0x34, 0x89, 0x02, 0xCD, 0xBA, 0xB9,
1750x02, 0x34, 0x47, 0xF3, 0xD1, 0x18, 0x5A, 0xBA,
1760x14, 0x8C, 0x2E, 0xD2, 0x16, 0x95, 0x28, 0x12,
1770x10, 0x29, 0x46, 0xCC, 0x00, 0x33, 0xC9, 0x71,
1780xC4, 0xFB, 0x0D, 0xDE, 0xCB, 0xBF, 0x18, 0x5C,
1790x97, 0x1C, 0x4F, 0xB0, 0xDD, 0xEC, 0xBB, 0xF1,
1800x83, 0x30, 0x80, 0x0C, 0xF2, 0x5C, 0x71, 0x3E,
1810xC3, 0x77, 0xB2, 0xEF, 0xC6, 0x17, 0x25, 0xC7,
1820x13, 0xEC, 0x37, 0x7B, 0x2E, 0xFC, 0x60, 0xCC,
1830x20, 0x03, 0x3C, 0x97, 0x1C, 0x4F, 0xB0, 0xDD,
1840xEC, 0xBB, 0xF1, 0x81, 0x9C, 0xD7, 0x1C, 0x23,
1850xA7, 0x6D, 0x1C, 0x4B, 0x3A, 0xD3, 0x34, 0xCC,
1860xA5, 0xBE, 0x56, 0x5C, 0xB5, 0x5A, 0x16, 0x2F,
1870x05, 0xA4, 0x74, 0xE8, 0x2D, 0x25, 0x30, 0xDE,
1880x69, 0x89, 0x08, 0x69, 0x20, 0x69, 0xA6, 0x93,
1890x61, 0x09, 0xBB, 0xD6, 0x35, 0x90, 0x19, 0x99,
1900x2E, 0x18, 0x99, 0x1E, 0x37, 0x3A, 0x9C, 0x07,
1910x8D, 0x36, 0xE6, 0xA6, 0x42, 0x6D, 0x1F, 0xB3,
1920xE3, 0x69, 0x99, 0x95, 0xEB, 0x7C, 0x92, 0xB9,
1930x71, 0xD9, 0xD6, 0x2A, 0x8F, 0x47, 0x4E, 0x82,
1940xAA, 0x53, 0x0E, 0xE6, 0x9E, 0x42, 0x1C, 0x48,
1950x1C, 0x69, 0xC4, 0xDA, 0x42, 0x6E, 0xF5, 0x07,
1960xF1, 0x08, 0x00, 0xCB, 0x40, 0xF7, 0x1B, 0xBD,
1970x67, 0xB4, 0xEC, 0x53, 0x14, 0xE9, 0x74, 0xAB,
1980x47, 0x2C, 0x96, 0xB5, 0xBD, 0x22, 0x40, 0xA5,
1990xFD, 0xE1, 0x01, 0x12, 0x99, 0xCC, 0x4A, 0x67,
2000xFC, 0xC9, 0xB0, 0xA5, 0xF4, 0x62, 0x58, 0x44,
2010x84, 0x06, 0x73, 0x5C, 0x6C, 0xDE, 0xC4, 0x92,
2020xE2, 0x59, 0xD9, 0x3D, 0x99, 0x72, 0xFA, 0x49,
2030x24, 0xA2, 0xB5, 0x59, 0xE5, 0x2D, 0x28, 0x55,
2040x54, 0xAF, 0x8A, 0xD2, 0x52, 0x9D, 0xD1, 0x1E,
2050x69, 0x4E, 0x36, 0x89, 0xC5, 0x38, 0xDD, 0xBB,
2060xE8, 0xC7, 0x71, 0x42, 0x63, 0xA5, 0xC4, 0xEB,
2070xEF, 0xFB, 0x83, 0x24, 0x78, 0xA6, 0x4B, 0x86,
2080x26, 0x47, 0x8D, 0xCE, 0xA7, 0x01, 0x6B, 0x11,
2090xFB, 0x76, 0x74, 0xF1, 0xAA, 0x97, 0x94, 0x5A,
2100xC4, 0x7E, 0xDD, 0x9D, 0x3C, 0x6A, 0xA5, 0xE5,
2110x0C, 0xC2, 0x00, 0x33, 0xAC, 0x47, 0xED, 0xD9,
2120xD3, 0xC6, 0xAA, 0x5E, 0x50, 0x67, 0x35, 0xC6,
2130xCD, 0xEC, 0x49, 0x2E, 0x25, 0x9D, 0x93, 0xD9,
2140x97, 0x2F, 0xA4, 0x92, 0x4A, 0x2B, 0x55, 0x9E,
2150x52, 0xD2, 0x85, 0x55, 0x4A, 0xF8, 0xAD, 0x25,
2160x29, 0xDD, 0x11, 0xE6, 0x94, 0xE3, 0x68, 0x9C,
2170x53, 0x8D, 0xDB, 0xBE, 0x8C, 0x77, 0x14, 0x6B,
2180x20, 0x33, 0x32, 0x5C, 0x31, 0x32, 0x3C, 0x6E,
2190x75, 0x38, 0x0C, 0xCD, 0x3E, 0x76, 0x89, 0xBB,
2200x97, 0xF4, 0x3B, 0x4D, 0x5D, 0xD6, 0x86, 0xD4,
2210x5B, 0xAC, 0x9F, 0xC6, 0x90, 0x2F, 0xDA, 0xA9,
2220x59, 0xE9, 0xFC, 0xD1, 0x09, 0x42, 0x8C, 0x0C,
2230xDF, 0xBE, 0x9E, 0xCD, 0xC5, 0x1A, 0x67, 0x58,
2240x8F, 0xDB, 0xB3, 0xA7, 0x8D, 0x54, 0xBC, 0xA3,
2250x8C, 0xFE, 0xD0, 0x76, 0x16, 0xFF, 0x00, 0x76,
2260x0A, 0xAD, 0xAD, 0xE9, 0x66, 0xD1, 0x5A, 0x7D,
2270x52, 0xCF, 0x4E, 0xD5, 0x6A, 0x4E, 0xAC, 0x8B,
2280xD3, 0xA4, 0x4A, 0x14, 0x61, 0x1D, 0xC7, 0x47,
2290x76, 0xCD, 0xE2, 0x7D, 0xAA, 0xAF, 0xD9, 0xDA,
2300xBB, 0x09, 0x5D, 0xB5, 0xD7, 0xB5, 0xEB, 0x77,
2310x54, 0xF5, 0x4D, 0x12, 0x52, 0x43, 0x59, 0x58,
2320x9D, 0x1A, 0x2F, 0x4F, 0x9D, 0x08, 0x53, 0x8E,
2330xE2, 0xC6, 0x10, 0xF7, 0x80, 0xEC, 0xF5, 0x88,
2340xFD, 0xBB, 0x3A, 0x78, 0xD5, 0x4B, 0xCA, 0x2D,
2350x62, 0x3F, 0x6E, 0xCE, 0x9E, 0x35, 0x52, 0xF2,
2360x8C, 0x67, 0xCA, 0x8D, 0xFB, 0x7B, 0x73, 0xDD,
2370x2A, 0x5F, 0x04, 0x5C, 0xA8, 0xDF, 0xB7, 0xB7,
2380x3D, 0xD2, 0xA5, 0xF0, 0x40, 0x6C, 0xCD, 0x62,
2390x3F, 0x6E, 0xCE, 0x9E, 0x35, 0x52, 0xF2, 0x8B,
2400x58, 0x8F, 0xDB, 0xB3, 0xA7, 0x8D, 0x54, 0xBC,
2410xA3, 0x33, 0x3B, 0x27, 0xA5, 0x3B, 0x17, 0x95,
2420x78, 0x68, 0x54, 0xBB, 0x7A, 0xDD, 0xD5, 0x56,
2430xBE, 0xA9, 0x25, 0xA1, 0xAB, 0xAC, 0xA7, 0x43,
2440xE7, 0x4C, 0x36, 0x31, 0xA0, 0x7E, 0xE8, 0xC2,
2450x1B, 0x7E, 0x81, 0xD9, 0xFC, 0xBB, 0x3F, 0x77,
2460x28, 0x06, 0x6D, 0x62, 0x3F, 0x6E, 0xCE, 0x9E,
2470x35, 0x52, 0xF2, 0x83, 0x39, 0xAE, 0x36, 0x6F,
2480x62, 0x49, 0x71, 0x2C, 0xEC, 0x9E, 0xCC, 0xB9,
2490x7D, 0x24, 0x92, 0x51, 0x5A, 0xAC, 0xF2, 0x96,
2500x94, 0x2A, 0xAA, 0x57, 0xC5, 0x69, 0x29, 0x4E,
2510xE8, 0x8F, 0x34, 0xA7, 0x1B, 0x44, 0xE2, 0x9C,
2520x6E, 0xDD, 0xF4, 0x63, 0xB8, 0xA3, 0xC5, 0xF9,
2530x76, 0x7E, 0xEE, 0x51, 0xC6, 0x39, 0x2E, 0x56,
2540x3A, 0xB0, 0x92, 0x35, 0x69, 0xFE, 0x53, 0xE9,
2550xAC, 0x1F, 0xE1, 0x7F, 0xEB, 0xA4, 0xAC, 0xF9,
2560xFE, 0x93, 0xE7, 0x2B, 0x3D, 0x2F, 0xFA, 0xD9,
2570x00, 0x1B, 0xFC, 0x42, 0x10, 0x0C, 0x9A, 0xD4,
2580xBE, 0x39, 0x09, 0xCF, 0xBF, 0x67, 0xD5, 0x28,
2590x4A, 0x08, 0x6D, 0xF2, 0xB2, 0xE5, 0xC3, 0x76,
2600xC9, 0xB4, 0x8F, 0x47, 0x6B, 0xA0, 0xAA, 0x42,
2610x25, 0xE9, 0x48, 0x8C, 0xF3, 0x4C, 0xA0, 0x6A,
2620x42, 0x1D, 0xCE, 0x84, 0x61, 0x02, 0x6D, 0xDC,
2630x64, 0xE4, 0xA7, 0x5B, 0xAB, 0x57, 0x61, 0x24,
2640x31, 0x5A, 0x05, 0x7A, 0xDD, 0xD5, 0xDD, 0x6E,
2650xF7, 0xA9, 0xAC, 0xAC, 0x4E, 0x91, 0x2F, 0xA1,
2660x52, 0x74, 0x21, 0x4E, 0x1B, 0xCB, 0x18, 0x47,
2670xDC, 0x34, 0xCC, 0xF6, 0xB0, 0xC4, 0xD7, 0x70,
2680x59, 0xD4, 0x02, 0x99, 0x2E, 0x18, 0x99, 0x1E,
2690x37, 0x3A, 0x9C, 0x00, 0xCF, 0x2E, 0x7F, 0xB2,
2700xEE, 0xFF, 0x00, 0xFD, 0x38, 0xB9, 0x73, 0xFD,
2710x97, 0x77, 0xFF, 0x00, 0xE9, 0xC6, 0xCC, 0x10,
2720x0C, 0x67, 0xCB, 0x9F, 0xEC, 0xBB, 0xBF, 0xFF,
2730x00, 0x4E, 0x38, 0xC7, 0x25, 0x3A, 0xDD, 0x5A,
2740xBB, 0x09, 0x21, 0x8A, 0xD0, 0x2B, 0xD6, 0xEE,
2750xAE, 0xEB, 0x77, 0xBD, 0x4D, 0x65, 0x62, 0x74,
2760x89, 0x7D, 0x0A, 0x93, 0xA1, 0x0A, 0x70, 0xDE,
2770x58, 0xC2, 0x3E, 0xE1, 0xBF, 0xC0, 0xCC, 0xC9,
2780x70, 0xC4, 0xC8, 0xF1, 0xB9, 0xD4, 0xE0, 0x33,
2790x33, 0xED, 0x9D, 0x6E, 0xB2, 0x9D, 0x84, 0xAE,
2800xC5, 0x68, 0x15, 0xD5, 0x78, 0xD4, 0xF5, 0xBB,
2810xDE, 0xBA, 0xAE, 0xAD, 0x3A, 0x34, 0xBE, 0x85,
2820x49, 0xB1, 0x8D, 0x08, 0x6F, 0x24, 0x23, 0x1F,
2830x70, 0x9F, 0x6C, 0xEB, 0x75, 0x94, 0xEC, 0x25,
2840x76, 0x2B, 0x40, 0xAE, 0xAB, 0xC6, 0xA7, 0xAD,
2850xDE, 0xF5, 0xD5, 0x75, 0x69, 0xD1, 0xA5, 0xF4,
2860x2A, 0x4D, 0x8C, 0x68, 0x43, 0x79, 0x21, 0x18,
2870xFB, 0x86, 0x99, 0x9E, 0xD6, 0x18, 0x9A, 0xEE,
2880x0B, 0x3A, 0x80, 0x53, 0xDA, 0xC3, 0x13, 0x5D,
2890xC1, 0x67, 0x50, 0x00, 0xCC, 0xCE, 0x4A, 0x75,
2900xBA, 0xB5, 0x76, 0x12, 0x43, 0x15, 0xA0, 0x57,
2910xAD, 0xDD, 0x5D, 0xD6, 0xEF, 0x7A, 0x9A, 0xCA,
2920xC4, 0xE9, 0x12, 0xFA, 0x15, 0x27, 0x42, 0x14,
2930xE1, 0xBC, 0xB1, 0x84, 0x7D, 0xC3, 0xB3, 0xE5,
2940xCF, 0xF6, 0x5D, 0xDF, 0xFF, 0x00, 0xA7, 0x0C,
2950xD3, 0x25, 0xC3, 0x13, 0x23, 0xC6, 0xE7, 0x53,
2960x86, 0x60, 0x18, 0x01, 0x92, 0x9D, 0x6D, 0xC0,
2970xF3, 0xDB, 0x76, 0xD7, 0x40, 0xAD, 0x3A, 0x55,
2980x60, 0xEA, 0x97, 0xBD, 0x0B, 0x2D, 0x95, 0x01,
2990x51, 0x7A, 0x75, 0x25, 0xA7, 0x4A, 0x31, 0xDC,
3000x6C, 0x37, 0x6D, 0xDE, 0x3B, 0x3E, 0x5C, 0xFF,
3010x00, 0x65, 0xDD, 0xFF, 0x00, 0xFA, 0x70, 0xCC,
3020xE9, 0x71, 0x3A, 0xFB, 0xFE, 0xE0, 0xC9, 0x1E,
3030x19, 0x80, 0x63, 0x3E, 0x5C, 0xFF, 0x00, 0x65,
3040xDD, 0xFF, 0x00, 0xFA, 0x71, 0xC6, 0x39, 0x29,
3050xD6, 0xEA, 0xD5, 0xD8, 0x49, 0x0C, 0x56, 0x81,
3060x5E, 0xB7, 0x75, 0x77, 0x5B, 0xBD, 0xEA, 0x6B,
3070x2B, 0x13, 0xA4, 0x4B, 0xE8, 0x54, 0x9D, 0x08,
3080x53, 0x86, 0xF2, 0xC6, 0x11, 0xF7, 0x0D, 0xFE,
3090x06, 0x66, 0x4B, 0x86, 0x26, 0x47, 0x8D, 0xCE,
3100xA7, 0x00, 0xCC, 0x21, 0x08, 0x00, 0xCC, 0xF6,
3110xB0, 0xC4, 0xD7, 0x70, 0x59, 0xD4, 0x02, 0x99,
3120x2E, 0x18, 0x99, 0x1E, 0x37, 0x3A, 0x9C, 0x53,
3130xDA, 0xC3, 0x13, 0x5D, 0xC1, 0x67, 0x50, 0x0A,
3140x64, 0xB8, 0x62, 0x64, 0x78, 0xDC, 0xEA, 0x70,
3150x0C, 0xC2, 0x10, 0x80, 0x40, 0x66, 0x64, 0xB8,
3160x62, 0x64, 0x78, 0xDC, 0xEA, 0x70, 0xCC, 0x06,
3170x66, 0x4B, 0x86, 0x26, 0x47, 0x8D, 0xCE, 0xA7,
3180x01, 0x4F, 0x6B, 0x0C, 0x4D, 0x77, 0x05, 0x9D,
3190x40, 0x29, 0xED, 0x61, 0x89, 0xAE, 0xE0, 0xB3,
3200xA8, 0x05, 0x3D, 0xAC, 0x31, 0x35, 0xDC, 0x16,
3210x75, 0x00, 0xA7, 0xB5, 0x86, 0x26, 0xBB, 0x82,
3220xCE, 0xA0, 0x01, 0x4C, 0x97, 0x0C, 0x4C, 0x8F,
3230x1B, 0x9D, 0x4E, 0x19, 0x86, 0x4D, 0x9A, 0xE3,
3240xFB, 0x74, 0xEC, 0x5B, 0x89, 0x67, 0x59, 0x96,
3250x99, 0xAB, 0xB0, 0x4A, 0xCA, 0x76, 0xAB, 0x42,
3260xBD, 0xDE, 0xB4, 0x92, 0x85, 0x35, 0xA4, 0xA7,
3270x9B, 0xCE, 0x31, 0x19, 0x4D, 0x2C, 0x4D, 0x38,
3280xD2, 0xEC, 0x29, 0x77, 0xFA, 0xC2, 0x67, 0x2A,
3290x37, 0x13, 0xED, 0xCF, 0x74, 0xAE, 0xFC, 0x10,
3300x03, 0x33, 0x80, 0xFA, 0xCE, 0xFE, 0x13, 0xFC,
3310xB0, 0xCD, 0x32, 0x5C, 0x31, 0x32, 0x3C, 0x6E,
3320x75, 0x38, 0x00, 0x79, 0x2D, 0x4C, 0x84, 0xDA,
3330x33, 0x13, 0x91, 0x69, 0x99, 0x95, 0xEB, 0x7C,
3340x92, 0xB9, 0xA2, 0xF6, 0x75, 0x8A, 0xA3, 0xD1,
3350xD3, 0xA0, 0x79, 0xA6, 0x1D, 0xCD, 0x3C, 0x84,
3360x38, 0x90, 0x38, 0xD3, 0x89, 0xB4, 0x84, 0xDD,
3370xEA, 0x0F, 0xF3, 0x25, 0xC3, 0x13, 0x23, 0xC6,
3380xE7, 0x53, 0x80, 0x66, 0x03, 0x33, 0x25, 0xC3,
3390x13, 0x23, 0xC6, 0xE7, 0x53, 0x86, 0x60, 0x33,
3400x32, 0x5C, 0x31, 0x32, 0x3C, 0x6E, 0x75, 0x38,
3410x06, 0x61, 0x08, 0x40, 0x06, 0x67, 0xB5, 0x86,
3420x26, 0xBB, 0x82, 0xCE, 0xA0, 0x14, 0xC9, 0x70,
3430xC4, 0xC8, 0xF1, 0xB9, 0xD4, 0xE2, 0x9E, 0xD6,
3440x18, 0x9A, 0xEE, 0x0B, 0x3A, 0x80, 0x53, 0x25,
3450xC3, 0x13, 0x23, 0xC6, 0xE7, 0x53, 0x80, 0x66,
3460x10, 0x84, 0x02, 0x03, 0x33, 0x25, 0xC3, 0x13,
3470x23, 0xC6, 0xE7, 0x53, 0x86, 0x60, 0x33, 0x32,
3480x5C, 0x31, 0x32, 0x3C, 0x6E, 0x75, 0x38, 0x0A,
3490x7B, 0x58, 0x62, 0x6B, 0xB8, 0x2C, 0xEA, 0x01,
3500x4F, 0x6B, 0x0C, 0x4D, 0x77, 0x05, 0x9D, 0x40,
3510x29, 0xED, 0x61, 0x89, 0xAE, 0xE0, 0xB3, 0xA8,
3520x05, 0x3D, 0xAC, 0x31, 0x35, 0xDC, 0x16, 0x75,
3530x00, 0x06, 0x61, 0x08, 0x40, 0x31, 0x9C, 0xEB,
3540x65, 0x86, 0xEE, 0x5F, 0xD7, 0x2C, 0x93, 0xA6,
3550x36, 0x66, 0x4D, 0x95, 0xB8, 0xFF, 0x00, 0x82,
3560xDD, 0x88, 0x0F, 0xB5, 0x5A, 0xAA, 0x4E, 0xF9,
3570xF8, 0x11, 0x21, 0x94, 0x52, 0x12, 0x9E, 0xF3,
3580xA3, 0xBB, 0x61, 0x07, 0xB5, 0x35, 0xC6, 0x31,
3590xEC, 0x4A, 0xCE, 0x25, 0x9D, 0x94, 0x19, 0x97,
3600xD1, 0xA3, 0x72, 0x4A, 0x5B, 0x55, 0x9E, 0x4D,
3610xD1, 0x75, 0x55, 0xBA, 0x88, 0x2D, 0x25, 0x21,
3620xDD, 0x29, 0xE7, 0x10, 0xE3, 0xA9, 0x1C, 0x43,
3630x8E, 0xDB, 0xBA, 0x94, 0x37, 0x10, 0x78, 0xB3,
3640x80, 0xFA, 0xCE, 0xFE, 0x13, 0xFC, 0xB0, 0xCD,
3650x32, 0x5C, 0x31, 0x32, 0x3C, 0x6E, 0x75, 0x38,
3660x0B, 0x57, 0x6F, 0xDB, 0xB4, 0x5F, 0x82, 0x94,
3670xBC, 0xC0, 0xCE, 0x6B, 0x8C, 0x63, 0xD8, 0x95,
3680x9C, 0x4B, 0x3B, 0x28, 0x33, 0x2F, 0xA3, 0x46,
3690xE4, 0x94, 0xB6, 0xAB, 0x3C, 0x9B, 0xA2, 0xEA,
3700xAB, 0x75, 0x10, 0x5A, 0x4A, 0x43, 0xBA, 0x53,
3710xCE, 0x21, 0xC7, 0x52, 0x38, 0x87, 0x1D, 0xB7,
3720x75, 0x28, 0x6E, 0x20, 0xD6, 0x40, 0x66, 0x64,
3730xB8, 0x62, 0x64, 0x78, 0xDC, 0xEA, 0x70, 0x16,
3740xB1, 0x1F, 0xB7, 0x67, 0x4F, 0x1A, 0xA9, 0x79,
3750x45, 0xAC, 0x47, 0xED, 0xD9, 0xD3, 0xC6, 0xAA,
3760x5E, 0x50, 0xCC, 0x20, 0x19, 0x36, 0x74, 0x6D,
3770x9B, 0xD8, 0x95, 0x9C, 0x4B, 0x45, 0x27, 0xB4,
3780xCE, 0x5F, 0x46, 0xE4, 0x94, 0xB6, 0x5B, 0x44,
3790xA5, 0xA5, 0x0A, 0xAB, 0x75, 0x10, 0x5A, 0x44,
3800x53, 0x7A, 0x23, 0x0D, 0x21, 0xC7, 0x52, 0x38,
3810x86, 0x9B, 0xB3, 0x75, 0x28, 0xEE, 0x20, 0xA6,
3820xB8, 0xD9, 0xBD, 0x89, 0x25, 0xC4, 0xB3, 0xB2,
3830x7B, 0x32, 0xE5, 0xF4, 0x92, 0x49, 0x45, 0x6A,
3840xB3, 0xCA, 0x5A, 0x50, 0xAA, 0xA9, 0x5F, 0x15,
3850xA4, 0xA5, 0x3B, 0xA2, 0x3C, 0xD2, 0x9C, 0x6D,
3860x13, 0x8A, 0x71, 0xBB, 0x77, 0xD1, 0x8E, 0xE2,
3870x84, 0xC9, 0xED, 0x61, 0x89, 0xAE, 0xE0, 0xB3,
3880xA8, 0x05, 0x32, 0x5C, 0x31, 0x32, 0x3C, 0x6E,
3890x75, 0x38, 0x0B, 0x58, 0x8F, 0xDB, 0xB3, 0xA7,
3900x8D, 0x54, 0xBC, 0xA2, 0xD6, 0x23, 0xF6, 0xEC,
3910xE9, 0xE3, 0x55, 0x2F, 0x28, 0x66, 0x10, 0x01,
3920x9D, 0x62, 0x3F, 0x6E, 0xCE, 0x9E, 0x35, 0x52,
3930xF2, 0x8F, 0x6A, 0x6B, 0x8C, 0xB4, 0xBA, 0xC5,
3940xB8, 0x96, 0x75, 0x99, 0x69, 0x94, 0x6C, 0x12,
3950xB2, 0x9D, 0xAA, 0xD0, 0xAF, 0x5A, 0x62, 0x4A,
3960x14, 0xD6, 0x92, 0x9E, 0x6F, 0x38, 0xC2, 0x94,
3970xD2, 0xC4, 0xD3, 0x8D, 0x2E, 0xC2, 0x97, 0x7F,
3980xAC, 0x26, 0x08, 0x00, 0xCC, 0xF6, 0xB0, 0xC4,
3990xD7, 0x70, 0x59, 0xD4, 0x02, 0x9E, 0xD6, 0x18,
4000x9A, 0xEE, 0x0B, 0x3A, 0x80, 0x53, 0xDA, 0xC3,
4010x13, 0x5D, 0xC1, 0x67, 0x50, 0x0A, 0x7B, 0x58,
4020x62, 0x6B, 0xB8, 0x2C, 0xEA, 0x00, 0x0C, 0xC2,
4030x10, 0x80, 0x63, 0x39, 0xC0, 0x7D, 0x67, 0x7F,
4040x09, 0xFE, 0x58, 0x66, 0x99, 0x2E, 0x18, 0x99,
4050x1E, 0x37, 0x3A, 0x9C, 0x0C, 0xCE, 0x03, 0xEB,
4060x3B, 0xF8, 0x4F, 0xF2, 0xC3, 0x34, 0xC9, 0x70,
4070xC4, 0xC8, 0xF1, 0xB9, 0xD4, 0xE0, 0x19, 0x80,
4080xCC, 0xC9, 0x70, 0xC4, 0xC8, 0xF1, 0xB9, 0xD4,
4090xE1, 0x98, 0x0C, 0xCC, 0x97, 0x0C, 0x4C, 0x8F,
4100x1B, 0x9D, 0x4E, 0x03, 0xFF, 0xD9};
411static const int goodJpegImageWidth = 128;
412static const int goodJpegImageHeight = 128;
halcanary@google.comfed30372013-10-04 12:46:45 +0000413
414// https://code.google.com/p/android/issues/detail?id=42382
415// https://code.google.com/p/android/issues/detail?id=9064
416// https://code.google.com/p/skia/issues/detail?id=1649
417
418/**
419 This test will test the ability of the SkImageDecoder to deal with
420 Jpeg files which have been mangled somehow. We want to display as
421 much of the jpeg as possible.
422*/
tfarina@chromium.orge4fafb12013-12-12 21:11:12 +0000423DEF_TEST(Jpeg, reporter) {
halcanary@google.comfed30372013-10-04 12:46:45 +0000424 size_t len = sizeof(goodJpegImage) / 2;
425 // I am explicitly not putting the entire image into the
426 // DecodeMemory. This simulates a network error.
427
428 SkBitmap bm8888;
429 bool imageDecodeSuccess = SkImageDecoder::DecodeMemory(
430 static_cast<void *>(goodJpegImage), len, &bm8888);
431 REPORTER_ASSERT(reporter, imageDecodeSuccess);
432 REPORTER_ASSERT(reporter, bm8888.width() == goodJpegImageWidth);
433 REPORTER_ASSERT(reporter, bm8888.height() == goodJpegImageHeight);
434 REPORTER_ASSERT(reporter, !(bm8888.empty()));
435
436 // Pick a few pixels and verify that their colors match the colors
437 // we expect (given the original image).
438 REPORTER_ASSERT(reporter, bm8888.getColor(7, 9) == 0xffffffff);
439 REPORTER_ASSERT(reporter, bm8888.getColor(28, 3) == 0xff000000);
440 REPORTER_ASSERT(reporter, bm8888.getColor(27, 34) == 0xffffffff);
441 REPORTER_ASSERT(reporter, bm8888.getColor(71, 18) == 0xff000000);
442
caryclark936b7342014-07-11 12:14:51 -0700443#ifdef SK_BUILD_FOR_IOS // the iOS jpeg decoder fills to gray
444 REPORTER_ASSERT(reporter, bm8888.getColor(127, 127) == 0xff808080
445 || bm8888.getColor(127, 127) == SK_ColorWHITE);
446#else
halcanary@google.comfed30372013-10-04 12:46:45 +0000447 // This is the fill color
448 REPORTER_ASSERT(reporter, bm8888.getColor(127, 127) == SK_ColorWHITE);
caryclark936b7342014-07-11 12:14:51 -0700449#endif
halcanary@google.comfed30372013-10-04 12:46:45 +0000450
451 #if JPEG_TEST_WRITE_TO_FILE_FOR_DEBUGGING
452 // Check to see that the resulting bitmap is nice
453 bool writeSuccess = (!(bm8888.empty())) && SkImageEncoder::EncodeFile(
454 "HalfOfAJpeg.png", bm8888, SkImageEncoder::kPNG_Type, 100);
455 SkASSERT(writeSuccess);
456 #endif
457}
sugoib227e372014-10-16 13:10:57 -0700458
459DEF_TEST(Jpeg_YUV, reporter) {
460 size_t len = sizeof(goodJpegImage);
halcanary385fe4d2015-08-26 13:07:48 -0700461 SkMemoryStream* stream = new SkMemoryStream(goodJpegImage, len);
sugoib227e372014-10-16 13:10:57 -0700462 SkDecodingImageGenerator::Options opts;
reed74bd9532015-09-14 08:52:12 -0700463 SkAutoTDelete<SkImageGenerator> gen(SkDecodingImageGenerator::Create(stream, opts));
464 REPORTER_ASSERT(reporter, gen);
465 if (!gen) {
sugoib227e372014-10-16 13:10:57 -0700466 return;
467 }
468
sugoib227e372014-10-16 13:10:57 -0700469 SkISize yuvSizes[3];
reed74bd9532015-09-14 08:52:12 -0700470 bool sizesComputed = gen->getYUV8Planes(yuvSizes, nullptr, nullptr, nullptr);
sugoib227e372014-10-16 13:10:57 -0700471 REPORTER_ASSERT(reporter, sizesComputed);
sugoib227e372014-10-16 13:10:57 -0700472 if (!sizesComputed) {
473 return;
474 }
475
476 // Allocate the memory for YUV
477 size_t totalSize(0);
478 size_t sizes[3], rowBytes[3];
479 const int32_t expected_sizes[] = {128, 64, 64};
480 for (int i = 0; i < 3; ++i) {
481 rowBytes[i] = yuvSizes[i].fWidth;
482 totalSize += sizes[i] = rowBytes[i] * yuvSizes[i].fHeight;
483 REPORTER_ASSERT(reporter, rowBytes[i] == (size_t)expected_sizes[i]);
484 REPORTER_ASSERT(reporter, yuvSizes[i].fWidth == expected_sizes[i]);
485 REPORTER_ASSERT(reporter, yuvSizes[i].fHeight == expected_sizes[i]);
486 }
487 SkAutoMalloc storage(totalSize);
488 void* planes[3];
489 planes[0] = storage.get();
490 planes[1] = (uint8_t*)planes[0] + sizes[0];
491 planes[2] = (uint8_t*)planes[1] + sizes[1];
492
493 // Get the YUV planes
reed74bd9532015-09-14 08:52:12 -0700494 REPORTER_ASSERT(reporter, gen->getYUV8Planes(yuvSizes, planes, rowBytes, nullptr));
sugoib227e372014-10-16 13:10:57 -0700495}
msarettb714fb02016-01-22 14:46:42 -0800496
497static SkStreamAsset* resource(const char path[]) {
498 SkString fullPath = GetResourcePath(path);
499 return SkStream::NewFromFile(fullPath.c_str());
500}
501
502static void codec_yuv(skiatest::Reporter* reporter,
503 const char path[],
504 SkISize expectedSizes[3]) {
505 SkAutoTDelete<SkStream> stream(resource(path));
506 if (!stream) {
507 SkDebugf("Missing resource '%s'\n", path);
508 return;
509 }
510 SkAutoTDelete<SkCodec> codec(SkCodec::NewFromStream(stream.detach()));
511 REPORTER_ASSERT(reporter, codec);
512 if (!codec) {
513 return;
514 }
515
516 // Test queryYUV8()
517 SkCodec::YUVSizeInfo info;
518 bool success = codec->queryYUV8(nullptr, nullptr);
519 REPORTER_ASSERT(reporter, !success);
520 success = codec->queryYUV8(&info, nullptr);
521 REPORTER_ASSERT(reporter, (expectedSizes == nullptr) == !success);
522 if (!success) {
523 return;
524 }
525 REPORTER_ASSERT(reporter,
526 0 == memcmp((const void*) &info, (const void*) expectedSizes, 3 * sizeof(SkISize)));
527 REPORTER_ASSERT(reporter, info.fYWidthBytes == (uint32_t) SkAlign8(info.fYSize.width()));
528 REPORTER_ASSERT(reporter, info.fUWidthBytes == (uint32_t) SkAlign8(info.fUSize.width()));
529 REPORTER_ASSERT(reporter, info.fVWidthBytes == (uint32_t) SkAlign8(info.fVSize.width()));
530 SkYUVColorSpace colorSpace;
531 success = codec->queryYUV8(&info, &colorSpace);
532 REPORTER_ASSERT(reporter,
533 0 == memcmp((const void*) &info, (const void*) expectedSizes, 3 * sizeof(SkISize)));
534 REPORTER_ASSERT(reporter, info.fYWidthBytes == (uint32_t) SkAlign8(info.fYSize.width()));
535 REPORTER_ASSERT(reporter, info.fUWidthBytes == (uint32_t) SkAlign8(info.fUSize.width()));
536 REPORTER_ASSERT(reporter, info.fVWidthBytes == (uint32_t) SkAlign8(info.fVSize.width()));
537 REPORTER_ASSERT(reporter, kJPEG_SkYUVColorSpace == colorSpace);
538
539 // Allocate the memory for the YUV decode
540 size_t totalBytes = info.fYWidthBytes * info.fYSize.height() +
541 info.fUWidthBytes * info.fUSize.height() +
542 info.fVWidthBytes * info.fVSize.height();
543 SkAutoMalloc storage(totalBytes);
544 void* planes[3];
545 planes[0] = storage.get();
546 planes[1] = SkTAddOffset<void>(planes[0], info.fYWidthBytes * info.fYSize.height());
547 planes[2] = SkTAddOffset<void>(planes[1], info.fUWidthBytes * info.fUSize.height());
548
549 // Test getYUV8Planes()
550 REPORTER_ASSERT(reporter, SkCodec::kInvalidInput ==
551 codec->getYUV8Planes(info, nullptr));
552 REPORTER_ASSERT(reporter, SkCodec::kSuccess ==
553 codec->getYUV8Planes(info, planes));
554}
555
556DEF_TEST(Jpeg_YUV_Codec, r) {
557 SkISize sizes[3];
558
559 sizes[0].set(128, 128);
560 sizes[1].set(64, 64);
561 sizes[2].set(64, 64);
562 codec_yuv(r, "color_wheel.jpg", sizes);
563
564 // H2V2
565 sizes[0].set(512, 512);
566 sizes[1].set(256, 256);
567 sizes[2].set(256, 256);
568 codec_yuv(r, "mandrill_512_q075.jpg", sizes);
569
570 // H1V1
571 sizes[1].set(512, 512);
572 sizes[2].set(512, 512);
573 codec_yuv(r, "mandrill_h1v1.jpg", sizes);
574
575 // H2V1
576 sizes[1].set(256, 512);
577 sizes[2].set(256, 512);
578 codec_yuv(r, "mandrill_h2v1.jpg", sizes);
579
580 // Non-power of two dimensions
581 sizes[0].set(439, 154);
582 sizes[1].set(220, 77);
583 sizes[2].set(220, 77);
584 codec_yuv(r, "cropped_mandrill.jpg", sizes);
585
586 sizes[0].set(8, 8);
587 sizes[1].set(4, 4);
588 sizes[2].set(4, 4);
589 codec_yuv(r, "randPixels.jpg", sizes);
590
591 // Progressive images
592 sizes[0].set(512, 512);
593 sizes[1].set(512, 512);
594 sizes[2].set(512, 512);
595 codec_yuv(r, "brickwork-texture.jpg", sizes);
596 codec_yuv(r, "brickwork_normal-map.jpg", sizes);
597
598 // A CMYK encoded image should fail.
599 codec_yuv(r, "CMYK.jpg", nullptr);
600 // A grayscale encoded image should fail.
601 codec_yuv(r, "grayscale.jpg", nullptr);
602 // A PNG should fail.
603 codec_yuv(r, "arrow.png", nullptr);
604}