blob: 2816de926afa56b01231c30a68f2547842e2eeff [file] [log] [blame]
/*
* 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));
}