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