164a0ec36555352ec31aa7c5a7630a5d042b010badjsollen@google.com 264a0ec36555352ec31aa7c5a7630a5d042b010badjsollen@google.com/* 364a0ec36555352ec31aa7c5a7630a5d042b010badjsollen@google.com * Copyright 2012 Google Inc. 464a0ec36555352ec31aa7c5a7630a5d042b010badjsollen@google.com * 564a0ec36555352ec31aa7c5a7630a5d042b010badjsollen@google.com * Use of this source code is governed by a BSD-style license that can be 664a0ec36555352ec31aa7c5a7630a5d042b010badjsollen@google.com * found in the LICENSE file. 764a0ec36555352ec31aa7c5a7630a5d042b010badjsollen@google.com */ 864a0ec36555352ec31aa7c5a7630a5d042b010badjsollen@google.com 964a0ec36555352ec31aa7c5a7630a5d042b010badjsollen@google.com 1064a0ec36555352ec31aa7c5a7630a5d042b010badjsollen@google.com#ifndef SkColorTable_DEFINED 1164a0ec36555352ec31aa7c5a7630a5d042b010badjsollen@google.com#define SkColorTable_DEFINED 1264a0ec36555352ec31aa7c5a7630a5d042b010badjsollen@google.com 1364a0ec36555352ec31aa7c5a7630a5d042b010badjsollen@google.com#include "SkColor.h" 1464a0ec36555352ec31aa7c5a7630a5d042b010badjsollen@google.com#include "SkFlattenable.h" 153443fd88862e25199973c2e98075d2e12ef21be0reed@google.com#include "SkImageInfo.h" 1664a0ec36555352ec31aa7c5a7630a5d042b010badjsollen@google.com 1764a0ec36555352ec31aa7c5a7630a5d042b010badjsollen@google.com/** \class SkColorTable 1864a0ec36555352ec31aa7c5a7630a5d042b010badjsollen@google.com 1964a0ec36555352ec31aa7c5a7630a5d042b010badjsollen@google.com SkColorTable holds an array SkPMColors (premultiplied 32-bit colors) used by 2064a0ec36555352ec31aa7c5a7630a5d042b010badjsollen@google.com 8-bit bitmaps, where the bitmap bytes are interpreted as indices into the colortable. 2164a0ec36555352ec31aa7c5a7630a5d042b010badjsollen@google.com*/ 2243f9d3edf888419474e17ec7b40aee49363d3e9ach.dumezclass SK_API SkColorTable : public SkRefCnt { 2364a0ec36555352ec31aa7c5a7630a5d042b010badjsollen@google.compublic: 240456e0b7b85060e9b9597ce414c4c2b19aff4f58robertphillips@google.com SK_DECLARE_INST_COUNT(SkColorTable) 250456e0b7b85060e9b9597ce414c4c2b19aff4f58robertphillips@google.com 2664a0ec36555352ec31aa7c5a7630a5d042b010badjsollen@google.com /** Makes a deep copy of colors. 2764a0ec36555352ec31aa7c5a7630a5d042b010badjsollen@google.com */ 2864a0ec36555352ec31aa7c5a7630a5d042b010badjsollen@google.com SkColorTable(const SkColorTable& src); 290a6151d66cc32d91eca037c91e557158cf8a2be2reed@google.com SkColorTable(const SkPMColor colors[], int count, 300a6151d66cc32d91eca037c91e557158cf8a2be2reed@google.com SkAlphaType alphaType = kPremul_SkAlphaType); 3164a0ec36555352ec31aa7c5a7630a5d042b010badjsollen@google.com virtual ~SkColorTable(); 3264a0ec36555352ec31aa7c5a7630a5d042b010badjsollen@google.com 330a6151d66cc32d91eca037c91e557158cf8a2be2reed@google.com SkAlphaType alphaType() const { return (SkAlphaType)fAlphaType; } 3464a0ec36555352ec31aa7c5a7630a5d042b010badjsollen@google.com 350a6151d66cc32d91eca037c91e557158cf8a2be2reed@google.com bool isOpaque() const { 360a6151d66cc32d91eca037c91e557158cf8a2be2reed@google.com return SkAlphaTypeIsOpaque(this->alphaType()); 370a6151d66cc32d91eca037c91e557158cf8a2be2reed@google.com } 3864a0ec36555352ec31aa7c5a7630a5d042b010badjsollen@google.com 3964a0ec36555352ec31aa7c5a7630a5d042b010badjsollen@google.com /** Returns the number of colors in the table. 4064a0ec36555352ec31aa7c5a7630a5d042b010badjsollen@google.com */ 4164a0ec36555352ec31aa7c5a7630a5d042b010badjsollen@google.com int count() const { return fCount; } 4264a0ec36555352ec31aa7c5a7630a5d042b010badjsollen@google.com 4364a0ec36555352ec31aa7c5a7630a5d042b010badjsollen@google.com /** Returns the specified color from the table. In the debug build, this asserts that 4464a0ec36555352ec31aa7c5a7630a5d042b010badjsollen@google.com the index is in range (0 <= index < count). 4564a0ec36555352ec31aa7c5a7630a5d042b010badjsollen@google.com */ 4664a0ec36555352ec31aa7c5a7630a5d042b010badjsollen@google.com SkPMColor operator[](int index) const { 4764a0ec36555352ec31aa7c5a7630a5d042b010badjsollen@google.com SkASSERT(fColors != NULL && (unsigned)index < fCount); 4864a0ec36555352ec31aa7c5a7630a5d042b010badjsollen@google.com return fColors[index]; 4964a0ec36555352ec31aa7c5a7630a5d042b010badjsollen@google.com } 5064a0ec36555352ec31aa7c5a7630a5d042b010badjsollen@google.com 510a6151d66cc32d91eca037c91e557158cf8a2be2reed@google.com /** 520a6151d66cc32d91eca037c91e557158cf8a2be2reed@google.com * Return the array of colors for reading. This must be balanced by a call 530a6151d66cc32d91eca037c91e557158cf8a2be2reed@google.com * to unlockColors(). 540a6151d66cc32d91eca037c91e557158cf8a2be2reed@google.com */ 550a6151d66cc32d91eca037c91e557158cf8a2be2reed@google.com const SkPMColor* lockColors() { 56c9ab987efcb7e8b69237d565f73c28c137610232djsollen@google.com SkDEBUGCODE(sk_atomic_inc(&fColorLockCount);) 5764a0ec36555352ec31aa7c5a7630a5d042b010badjsollen@google.com return fColors; 5864a0ec36555352ec31aa7c5a7630a5d042b010badjsollen@google.com } 590a6151d66cc32d91eca037c91e557158cf8a2be2reed@google.com 600a6151d66cc32d91eca037c91e557158cf8a2be2reed@google.com /** 610a6151d66cc32d91eca037c91e557158cf8a2be2reed@google.com * Balancing call to lockColors(). 620a6151d66cc32d91eca037c91e557158cf8a2be2reed@google.com */ 630a6151d66cc32d91eca037c91e557158cf8a2be2reed@google.com void unlockColors(); 6464a0ec36555352ec31aa7c5a7630a5d042b010badjsollen@google.com 6564a0ec36555352ec31aa7c5a7630a5d042b010badjsollen@google.com /** Similar to lockColors(), lock16BitCache() returns the array of 6664a0ec36555352ec31aa7c5a7630a5d042b010badjsollen@google.com RGB16 colors that mirror the 32bit colors. However, this function 6764a0ec36555352ec31aa7c5a7630a5d042b010badjsollen@google.com will return null if kColorsAreOpaque_Flag is not set. 6864a0ec36555352ec31aa7c5a7630a5d042b010badjsollen@google.com Also, unlike lockColors(), the returned array here cannot be modified. 6964a0ec36555352ec31aa7c5a7630a5d042b010badjsollen@google.com */ 7064a0ec36555352ec31aa7c5a7630a5d042b010badjsollen@google.com const uint16_t* lock16BitCache(); 7164a0ec36555352ec31aa7c5a7630a5d042b010badjsollen@google.com /** Balancing call to lock16BitCache(). 7264a0ec36555352ec31aa7c5a7630a5d042b010badjsollen@google.com */ 7364a0ec36555352ec31aa7c5a7630a5d042b010badjsollen@google.com void unlock16BitCache() { 7464a0ec36555352ec31aa7c5a7630a5d042b010badjsollen@google.com SkASSERT(f16BitCacheLockCount > 0); 7564a0ec36555352ec31aa7c5a7630a5d042b010badjsollen@google.com SkDEBUGCODE(f16BitCacheLockCount -= 1); 7664a0ec36555352ec31aa7c5a7630a5d042b010badjsollen@google.com } 7764a0ec36555352ec31aa7c5a7630a5d042b010badjsollen@google.com 788b0e8ac5f582de80356019406e2975079bf0829dcommit-bot@chromium.org explicit SkColorTable(SkReadBuffer&); 798b0e8ac5f582de80356019406e2975079bf0829dcommit-bot@chromium.org void writeToBuffer(SkWriteBuffer&) const; 8064a0ec36555352ec31aa7c5a7630a5d042b010badjsollen@google.com 8164a0ec36555352ec31aa7c5a7630a5d042b010badjsollen@google.comprivate: 8264a0ec36555352ec31aa7c5a7630a5d042b010badjsollen@google.com SkPMColor* fColors; 8364a0ec36555352ec31aa7c5a7630a5d042b010badjsollen@google.com uint16_t* f16BitCache; 8464a0ec36555352ec31aa7c5a7630a5d042b010badjsollen@google.com uint16_t fCount; 850a6151d66cc32d91eca037c91e557158cf8a2be2reed@google.com uint8_t fAlphaType; 8664a0ec36555352ec31aa7c5a7630a5d042b010badjsollen@google.com SkDEBUGCODE(int fColorLockCount;) 8764a0ec36555352ec31aa7c5a7630a5d042b010badjsollen@google.com SkDEBUGCODE(int f16BitCacheLockCount;) 8864a0ec36555352ec31aa7c5a7630a5d042b010badjsollen@google.com 8964a0ec36555352ec31aa7c5a7630a5d042b010badjsollen@google.com void inval16BitCache(); 9064a0ec36555352ec31aa7c5a7630a5d042b010badjsollen@google.com 91e0e1da34f3c00ec93c61643d4cf4eea6d27c5fefcommit-bot@chromium.org typedef SkRefCnt INHERITED; 9264a0ec36555352ec31aa7c5a7630a5d042b010badjsollen@google.com}; 9364a0ec36555352ec31aa7c5a7630a5d042b010badjsollen@google.com 9464a0ec36555352ec31aa7c5a7630a5d042b010badjsollen@google.com#endif 95