178acf96a67db1fe64a89fa7207195d1a79efc0c3dml/* 278acf96a67db1fe64a89fa7207195d1a79efc0c3dml * Copyright 2015 Google Inc. 378acf96a67db1fe64a89fa7207195d1a79efc0c3dml * 478acf96a67db1fe64a89fa7207195d1a79efc0c3dml * Use of this source code is governed by a BSD-style license that can be 578acf96a67db1fe64a89fa7207195d1a79efc0c3dml * found in the LICENSE file. 678acf96a67db1fe64a89fa7207195d1a79efc0c3dml */ 778acf96a67db1fe64a89fa7207195d1a79efc0c3dml 878acf96a67db1fe64a89fa7207195d1a79efc0c3dml#include "SkBitmap.h" 978acf96a67db1fe64a89fa7207195d1a79efc0c3dml#include "SkCanvas.h" 1078acf96a67db1fe64a89fa7207195d1a79efc0c3dml#include "SkForceLinking.h" 1178acf96a67db1fe64a89fa7207195d1a79efc0c3dml#include "SkImageDecoder.h" 1278acf96a67db1fe64a89fa7207195d1a79efc0c3dml#include "SkImageInfo.h" 1378acf96a67db1fe64a89fa7207195d1a79efc0c3dml#include "SkSurface.h" 1478acf96a67db1fe64a89fa7207195d1a79efc0c3dml#include "Test.h" 1578acf96a67db1fe64a89fa7207195d1a79efc0c3dml 1678acf96a67db1fe64a89fa7207195d1a79efc0c3dml// A 20x1 image with 8 bits per pixel and a palette size of 2. Pixel values are 255, 254... Run 1778acf96a67db1fe64a89fa7207195d1a79efc0c3dml// this test with ASAN to make sure we don't try to access before/after any palette-sized buffers. 1878acf96a67db1fe64a89fa7207195d1a79efc0c3dmlunsigned char gPng[] = { 1978acf96a67db1fe64a89fa7207195d1a79efc0c3dml 0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d, 2078acf96a67db1fe64a89fa7207195d1a79efc0c3dml 0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x01, 2178acf96a67db1fe64a89fa7207195d1a79efc0c3dml 0x08, 0x03, 0x00, 0x00, 0x00, 0xe9, 0x4c, 0x7e, 0x17, 0x00, 0x00, 0x00, 2278acf96a67db1fe64a89fa7207195d1a79efc0c3dml 0x09, 0x70, 0x48, 0x59, 0x73, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 2378acf96a67db1fe64a89fa7207195d1a79efc0c3dml 0x1c, 0x00, 0x0f, 0x01, 0xb9, 0x8f, 0x00, 0x00, 0x00, 0x06, 0x50, 0x4c, 2478acf96a67db1fe64a89fa7207195d1a79efc0c3dml 0x54, 0x45, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa5, 0x67, 0xb9, 0xcf, 2578acf96a67db1fe64a89fa7207195d1a79efc0c3dml 0x00, 0x00, 0x00, 0x20, 0x49, 0x44, 0x41, 0x54, 0x78, 0xda, 0xed, 0xfd, 2678acf96a67db1fe64a89fa7207195d1a79efc0c3dml 0x07, 0x01, 0x00, 0x20, 0x08, 0x00, 0x41, 0xbc, 0x5b, 0xe8, 0xdf, 0x97, 2778acf96a67db1fe64a89fa7207195d1a79efc0c3dml 0x99, 0xe3, 0x92, 0xa0, 0xf2, 0xdf, 0x3d, 0x7b, 0x0d, 0xda, 0x04, 0x1c, 2878acf96a67db1fe64a89fa7207195d1a79efc0c3dml 0x03, 0xad, 0x00, 0x38, 0x5c, 0x2e, 0xad, 0x12, 0x00, 0x00, 0x00, 0x00, 2978acf96a67db1fe64a89fa7207195d1a79efc0c3dml 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82 3078acf96a67db1fe64a89fa7207195d1a79efc0c3dml}; 3178acf96a67db1fe64a89fa7207195d1a79efc0c3dml 3278acf96a67db1fe64a89fa7207195d1a79efc0c3dmlDEF_TEST(IndexedPngOverflow, reporter) { 3378acf96a67db1fe64a89fa7207195d1a79efc0c3dml SkBitmap image; 3478acf96a67db1fe64a89fa7207195d1a79efc0c3dml SkForceLinking(false); 3578acf96a67db1fe64a89fa7207195d1a79efc0c3dml bool success = SkImageDecoder::DecodeMemory( 3678acf96a67db1fe64a89fa7207195d1a79efc0c3dml gPng, sizeof(gPng), &image, SkColorType::kUnknown_SkColorType, 3778acf96a67db1fe64a89fa7207195d1a79efc0c3dml SkImageDecoder::kDecodePixels_Mode); 3878acf96a67db1fe64a89fa7207195d1a79efc0c3dml REPORTER_ASSERT(reporter, success); 3978acf96a67db1fe64a89fa7207195d1a79efc0c3dml 4078acf96a67db1fe64a89fa7207195d1a79efc0c3dml SkAutoTUnref<SkSurface> surface(SkSurface::NewRaster(SkImageInfo::MakeN32Premul(20, 1))); 4178acf96a67db1fe64a89fa7207195d1a79efc0c3dml SkCanvas* canvas = surface->getCanvas(); 4278acf96a67db1fe64a89fa7207195d1a79efc0c3dml SkRect destRect = SkRect::MakeXYWH(0, 0, 20, 1); 4378acf96a67db1fe64a89fa7207195d1a79efc0c3dml canvas->drawBitmapRect(image, destRect, NULL); 4478acf96a67db1fe64a89fa7207195d1a79efc0c3dml} 45