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

#ifndef SkYUVPlanesCache_DEFINED
#define SkYUVPlanesCache_DEFINED

#include "SkCachedData.h"
#include "SkImageInfo.h"

class SkResourceCache;

class SkYUVPlanesCache {
public:
    /**
     * The Info struct contains data about the 3 Y, U and V planes of memory stored
     * contiguously, in that order, as a single block of memory within SkYUVPlanesCache.
     *
     * fSize: Width and height of each of the 3 planes (in pixels).
     * fSizeInMemory: Amount of memory allocated for each plane (may be different from
                      "height * rowBytes", depending on the jpeg decoder's block size).
     *                The sum of these is the total size stored within SkYUVPlanesCache.
     * fRowBytes: rowBytes for each of the 3 planes (in bytes).
     * fColorSpace: color space that will be used for the YUV -> RGB conversion.
     */
    struct Info {
        SkISize fSize[3];
        size_t  fSizeInMemory[3];
        size_t  fRowBytes[3];
        SkYUVColorSpace fColorSpace;
    };
    /**
     * On success, return a ref to the SkCachedData that holds the pixels.
     *
     * On failure, return nullptr.
     */
    static SkCachedData* FindAndRef(uint32_t genID, Info* info,
                                    SkResourceCache* localCache = nullptr);

    /**
     * Add a pixelRef ID and its YUV planes data to the cache.
     */
    static void Add(uint32_t genID, SkCachedData* data, Info* info,
                    SkResourceCache* localCache = nullptr);
};

#endif