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