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


#ifndef SkColorTable_DEFINED
#define SkColorTable_DEFINED

#include "../private/SkOnce.h"
#include "SkColor.h"
#include "SkFlattenable.h"
#include "SkImageInfo.h"

/** \class SkColorTable

    SkColorTable holds an array SkPMColors (premultiplied 32-bit colors) used by
    8-bit bitmaps, where the bitmap bytes are interpreted as indices into the colortable.

    SkColorTable is thread-safe.
*/
class SK_API SkColorTable : public SkRefCnt {
public:
    /** Copy up to 256 colors into a new SkColorTable.
     */
    SkColorTable(const SkPMColor colors[], int count);
    virtual ~SkColorTable();

    /** Returns the number of colors in the table.
     */
    int count() const { return fCount; }

    /** Returns the specified color from the table. In the debug build, this asserts that
     *  the index is in range (0 <= index < count).
     */
    SkPMColor operator[](int index) const {
        SkASSERT(fColors != NULL && (unsigned)index < (unsigned)fCount);
        return fColors[index];
    }

    /** Return the array of colors for reading.
     */
    const SkPMColor* readColors() const { return fColors; }

    /** read16BitCache() returns the array of RGB16 colors that mirror the 32bit colors.
     */
    const uint16_t* read16BitCache() const;

    void writeToBuffer(SkWriteBuffer&) const;

    // may return null
    static SkColorTable* Create(SkReadBuffer&);

private:
    enum AllocatedWithMalloc {
        kAllocatedWithMalloc
    };
    // assumes ownership of colors (assumes it was allocated w/ malloc)
    SkColorTable(SkPMColor* colors, int count, AllocatedWithMalloc);

    SkPMColor*            fColors;
    mutable uint16_t*     f16BitCache = nullptr;
    mutable SkOnce        f16BitCacheOnce;
    int                   fCount;

    void init(const SkPMColor* colors, int count);

    friend class SkImageGenerator;
    friend class SkBitmapRegionCodec;
    // Only call if no other thread or cache has seen this table.
    void dangerous_overwriteColors(const SkPMColor newColors[], int count) {
        if (count < 0 || count > fCount) {
            sk_throw();
        }
        // assumes that f16BitCache nas NOT been initialized yet, so we don't try to update it
        memcpy(fColors, newColors, count * sizeof(SkPMColor));
        fCount = count; // update fCount, in case count is smaller
    }

    typedef SkRefCnt INHERITED;
};

#endif
