1363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger/* 2363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger * Copyright 2012 Google Inc. 3363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger * 4363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger * Use of this source code is governed by a BSD-style license that can be 5363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger * found in the LICENSE file. 6363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger */ 7363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger 8363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger#include "SkBitmapFactory.h" 9363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger 10363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger#include "SkBitmap.h" 11363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger#include "SkData.h" 12363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger#include "SkImageDecoder.h" 13363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger#include "SkStream.h" 14363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger#include "SkTemplates.h" 15363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger 16363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenbergerbool SkBitmapFactory::DecodeBitmap(SkBitmap* dst, const SkData* data, Constraints constraint) { 17363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger if (NULL == data || data->size() == 0 || dst == NULL) { 18363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger return false; 19363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger } 20363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger 21363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger SkMemoryStream stream(data->data(), data->size()); 22363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger SkAutoTDelete<SkImageDecoder> decoder (SkImageDecoder::Factory(&stream)); 23363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger if (decoder.get() == NULL) { 24363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger return false; 25363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger } 26363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger 27363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger SkBitmap tmp; 28363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger SkImageDecoder::Mode mode; 29363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger if (kDecodeBoundsOnly_Constraint == constraint) { 30363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger mode = SkImageDecoder::kDecodeBounds_Mode; 31363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger } else { 32363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger mode = SkImageDecoder::kDecodePixels_Mode; 33363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger } 34363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger 35363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger if (decoder->decode(&stream, &tmp, mode)) { 36363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger tmp.swap(*dst); 37363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger return true; 38363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger } else { 39363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger return false; 40363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger } 41363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger} 42