/*
 * Copyright 2009 The Android Open Source Project
 *
 * Use of this source code is governed by a BSD-style license that can be
 * found in the LICENSE file.
 */


#include "SkColorTable.h"
#include "SkReadBuffer.h"
#include "SkWriteBuffer.h"
#include "SkStream.h"
#include "SkTemplates.h"

void SkColorTable::init(const SkPMColor colors[], int count) {
    SkASSERT((unsigned)count <= 256);

    fCount = count;
    fColors = reinterpret_cast<SkPMColor*>(sk_malloc_throw(count * sizeof(SkPMColor)));

    memcpy(fColors, colors, count * sizeof(SkPMColor));
}

SkColorTable::SkColorTable(const SkPMColor colors[], int count) {
    SkASSERT(0 == count || colors);
    SkASSERT(count >= 0 && count <= 256);
    this->init(colors, count);
}

SkColorTable::SkColorTable(SkPMColor* colors, int count, AllocatedWithMalloc)
    : fColors(colors)
    , fCount(count)
{
    SkASSERT(count > 0 && count <= 256);
    SkASSERT(colors);
}

SkColorTable::~SkColorTable() {
    sk_free(fColors);
    sk_free(f16BitCache);
}

#include "SkColorPriv.h"

const uint16_t* SkColorTable::read16BitCache() const {
    f16BitCacheOnce([this] {
        f16BitCache = (uint16_t*)sk_malloc_throw(fCount * sizeof(uint16_t));
        for (int i = 0; i < fCount; i++) {
            f16BitCache[i] = SkPixel32ToPixel16_ToU16(fColors[i]);
        }
    });
    return f16BitCache;
}

sk_sp<SkColorTable> SkColorTable::Make(const SkPMColor colors[], int count) {
    if (count < 0 || count > 256) {
        return nullptr;
    }
    if (count && !colors) {
        return nullptr;
    }
    return sk_make_sp<SkColorTable>(colors, count);
}

///////////////////////////////////////////////////////////////////////////////

#if 0
SkColorTable::SkColorTable(SkReadBuffer& buffer) {
    if (buffer.isVersionLT(SkReadBuffer::kRemoveColorTableAlpha_Version)) {
        /*fAlphaType = */buffer.readUInt();
    }

    fCount = buffer.getArrayCount();
    size_t allocSize = fCount * sizeof(SkPMColor);
    SkDEBUGCODE(bool success = false;)
    if (buffer.validateAvailable(allocSize)) {
        fColors = (SkPMColor*)sk_malloc_throw(allocSize);
        SkDEBUGCODE(success =) buffer.readColorArray(fColors, fCount);
    } else {
        fCount = 0;
        fColors = nullptr;
    }
#ifdef SK_DEBUG
    SkASSERT((unsigned)fCount <= 256);
    SkASSERT(success);
#endif
}
#endif

void SkColorTable::writeToBuffer(SkWriteBuffer& buffer) const {
    buffer.writeColorArray(fColors, fCount);
}

sk_sp<SkColorTable> SkColorTable::Create(SkReadBuffer& buffer) {
    const int count = buffer.getArrayCount();
    if (0 == count) {
        return sk_sp<SkColorTable>(new SkColorTable(nullptr, 0));
    }

    if (count < 0 || count > 256) {
        buffer.validate(false);
        return nullptr;
    }

    const size_t allocSize = count * sizeof(SkPMColor);
    std::unique_ptr<SkPMColor> colors((SkPMColor*)sk_malloc_throw(allocSize));
    if (!buffer.readColorArray(colors.get(), count)) {
        return nullptr;
    }

    return sk_sp<SkColorTable>(new SkColorTable(colors.release(), count, kAllocatedWithMalloc));
}
