/*
 * Copyright 2012 Google Inc.
 *
 * Use of this source code is governed by a BSD-style license that can be
 * found in the LICENSE file.
 */

#include "SkBitmapFactory.h"

#include "SkBitmap.h"
#include "SkData.h"
#include "SkImageDecoder.h"
#include "SkStream.h"
#include "SkTemplates.h"

bool SkBitmapFactory::DecodeBitmap(SkBitmap* dst, const SkData* data, Constraints constraint) {
    if (NULL == data || data->size() == 0 || dst == NULL) {
        return false;
    }

    SkMemoryStream stream(data->data(), data->size());
    SkAutoTDelete<SkImageDecoder> decoder (SkImageDecoder::Factory(&stream));
    if (decoder.get() == NULL) {
        return false;
    }

    SkBitmap tmp;
    SkImageDecoder::Mode mode;
    if (kDecodeBoundsOnly_Constraint == constraint) {
        mode = SkImageDecoder::kDecodeBounds_Mode;
    } else {
        mode = SkImageDecoder::kDecodePixels_Mode;
    }

    if (decoder->decode(&stream, &tmp, mode)) {
        tmp.swap(*dst);
        return true;
    } else {
        return false;
    }
}