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

#include "LazyDecodeBitmap.h"

#include "PictureRenderingFlags.h"  // --deferImageDecoding is defined here.
#include "SkBitmap.h"
#include "SkData.h"
#include "SkImageDecoder.h"
#include "SkForceLinking.h"
#include "SkLruImageCache.h"
#include "SkPurgeableImageCache.h"
#include "SkCommandLineFlags.h"

__SK_FORCE_IMAGE_DECODER_LINKING;

DEFINE_bool(useVolatileCache, false, "Use a volatile cache for deferred image decoding pixels. "
            "Only meaningful if --deferImageDecoding is set to true and the platform has an "
            "implementation.");

SkLruImageCache gLruImageCache(1024 * 1024);

namespace sk_tools {

// Simple cache selector to choose between a purgeable cache for large images and the standard one
// for smaller images.
//
class CacheSelector : public SkBitmapFactory::CacheSelector {

public:
    CacheSelector() {
        fPurgeableImageCache = SkPurgeableImageCache::Create();
    }

    ~CacheSelector() {
        SkSafeUnref(fPurgeableImageCache);
    }

    virtual SkImageCache* selectCache(const SkImageInfo& info) SK_OVERRIDE {
        if (info.fWidth * info.fHeight > 32 * 1024 && fPurgeableImageCache != NULL) {
            return fPurgeableImageCache;
        }
        return &gLruImageCache;
    }
private:
    SkImageCache* fPurgeableImageCache;
};

static CacheSelector gCacheSelector;
static SkBitmapFactory gFactory(&SkImageDecoder::DecodeMemoryToTarget);

bool LazyDecodeBitmap(const void* buffer, size_t size, SkBitmap* bitmap) {
    void* copiedBuffer = sk_malloc_throw(size);
    memcpy(copiedBuffer, buffer, size);
    SkAutoDataUnref data(SkData::NewFromMalloc(copiedBuffer, size));

    static bool gOnce;
    if (!gOnce) {
        // Only use the cache selector if there is a purgeable image cache to use for large
        // images.
        if (FLAGS_useVolatileCache && SkAutoTUnref<SkImageCache>(
                SkPurgeableImageCache::Create()).get() != NULL) {
            gFactory.setCacheSelector(&gCacheSelector);
        } else {
            gFactory.setImageCache(&gLruImageCache);
        }
        gOnce = true;
    }
    return gFactory.installPixelRef(data, bitmap);
}

}  // namespace sk_tools
