Home | History | Annotate | Download | only in core
      1 /*
      2  * Copyright 2009 The Android Open Source Project
      3  *
      4  * Use of this source code is governed by a BSD-style license that can be
      5  * found in the LICENSE file.
      6  */
      7 
      8 
      9 #include "SkColorTable.h"
     10 #include "SkReadBuffer.h"
     11 #include "SkWriteBuffer.h"
     12 #include "SkStream.h"
     13 #include "SkTemplates.h"
     14 
     15 void SkColorTable::init(const SkPMColor colors[], int count) {
     16     SkASSERT((unsigned)count <= 256);
     17 
     18     fCount = count;
     19     fColors = reinterpret_cast<SkPMColor*>(sk_malloc_throw(count * sizeof(SkPMColor)));
     20 
     21     memcpy(fColors, colors, count * sizeof(SkPMColor));
     22 }
     23 
     24 SkColorTable::SkColorTable(const SkPMColor colors[], int count) {
     25     SkASSERT(0 == count || colors);
     26     if (count < 0) {
     27         count = 0;
     28     } else if (count > 256) {
     29         count = 256;
     30     }
     31     this->init(colors, count);
     32 }
     33 
     34 SkColorTable::SkColorTable(SkPMColor* colors, int count, AllocatedWithMalloc)
     35     : fColors(colors)
     36     , fCount(count)
     37 {
     38     SkASSERT(count > 0 && count <= 256);
     39     SkASSERT(colors);
     40 }
     41 
     42 SkColorTable::~SkColorTable() {
     43     sk_free(fColors);
     44     sk_free(f16BitCache);
     45 }
     46 
     47 #include "SkColorPriv.h"
     48 
     49 const uint16_t* SkColorTable::read16BitCache() const {
     50     f16BitCacheOnce([this] {
     51         f16BitCache = (uint16_t*)sk_malloc_throw(fCount * sizeof(uint16_t));
     52         for (int i = 0; i < fCount; i++) {
     53             f16BitCache[i] = SkPixel32ToPixel16_ToU16(fColors[i]);
     54         }
     55     });
     56     return f16BitCache;
     57 }
     58 
     59 ///////////////////////////////////////////////////////////////////////////////
     60 
     61 #if 0
     62 SkColorTable::SkColorTable(SkReadBuffer& buffer) {
     63     if (buffer.isVersionLT(SkReadBuffer::kRemoveColorTableAlpha_Version)) {
     64         /*fAlphaType = */buffer.readUInt();
     65     }
     66 
     67     fCount = buffer.getArrayCount();
     68     size_t allocSize = fCount * sizeof(SkPMColor);
     69     SkDEBUGCODE(bool success = false;)
     70     if (buffer.validateAvailable(allocSize)) {
     71         fColors = (SkPMColor*)sk_malloc_throw(allocSize);
     72         SkDEBUGCODE(success =) buffer.readColorArray(fColors, fCount);
     73     } else {
     74         fCount = 0;
     75         fColors = nullptr;
     76     }
     77 #ifdef SK_DEBUG
     78     SkASSERT((unsigned)fCount <= 256);
     79     SkASSERT(success);
     80 #endif
     81 }
     82 #endif
     83 
     84 void SkColorTable::writeToBuffer(SkWriteBuffer& buffer) const {
     85     buffer.writeColorArray(fColors, fCount);
     86 }
     87 
     88 SkColorTable* SkColorTable::Create(SkReadBuffer& buffer) {
     89     if (buffer.isVersionLT(SkReadBuffer::kRemoveColorTableAlpha_Version)) {
     90         /*fAlphaType = */buffer.readUInt();
     91     }
     92 
     93     const int count = buffer.getArrayCount();
     94     if (0 == count) {
     95         return new SkColorTable(nullptr, 0);
     96     }
     97 
     98     if (count < 0 || count > 256) {
     99         buffer.validate(false);
    100         return nullptr;
    101     }
    102 
    103     const size_t allocSize = count * sizeof(SkPMColor);
    104     std::unique_ptr<SkPMColor> colors((SkPMColor*)sk_malloc_throw(allocSize));
    105     if (!buffer.readColorArray(colors.get(), count)) {
    106         return nullptr;
    107     }
    108 
    109     return new SkColorTable(colors.release(), count, kAllocatedWithMalloc);
    110 }
    111