
/*
 * 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:
    static sk_sp<SkColorTable> Make(const SkPMColor colors[], int count);

    /** Copy up to 256 colors into a new SkColorTable.
     */
    SkColorTable(const SkPMColor colors[], int count);
    ~SkColorTable() override;

    /** 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 sk_sp<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;

    typedef SkRefCnt INHERITED;
};

#endif
