11cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
20910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project/*
31cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * Copyright 2006 The Android Open Source Project
40910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project *
51cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * Use of this source code is governed by a BSD-style license that can be
61cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * found in the LICENSE file.
70910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project */
80910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
91cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
100910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#ifndef SkBitmap_DEFINED
110910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define SkBitmap_DEFINED
120910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
130910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "Sk64.h"
140910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkColor.h"
150910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkPoint.h"
160910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkRefCnt.h"
170910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
180910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectstruct SkIRect;
190910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectclass SkColorTable;
200910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectclass SkPaint;
210910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectclass SkPixelRef;
220910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectclass SkRegion;
230910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectclass SkFlattenableReadBuffer;
240910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectclass SkFlattenableWriteBuffer;
250910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
2640528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger// This is an opaque class, not interpreted by skia
2740528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenbergerclass SkGpuTexture;
2840528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger
290910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project/** \class SkBitmap
300910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
310910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    The SkBitmap class specifies a raster bitmap. A bitmap has an integer width
320910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    and height, and a format (config), and a pointer to the actual pixels.
3335e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger    Bitmaps can be drawn into a SkCanvas, but they are also used to specify the
3435e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger    target of a SkCanvas' drawing operations.
3535e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger    A const SkBitmap exposes getAddr(), which lets a caller write its pixels;
3635e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger    the constness is considered to apply to the bitmap's configuration, not
3735e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger    its contents.
380910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project*/
39137a4ca42423bbb6d683067ea544c9a48f18f06cDerek Sollenbergerclass SK_API SkBitmap {
400910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectpublic:
410910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    class Allocator;
420910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
430910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    enum Config {
440910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        kNo_Config,         //!< bitmap has not been configured
4540528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger        /**
4640528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger         *  1-bit per pixel, (0 is transparent, 1 is opaque)
4740528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger         *  Valid as a destination (target of a canvas), but not valid as a src.
4840528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger         *  i.e. you can draw into a 1-bit bitmap, but you cannot draw from one.
4940528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger         */
5040528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger        kA1_Config,
510910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        kA8_Config,         //!< 8-bits per pixel, with only alpha specified (0 is transparent, 0xFF is opaque)
520910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        kIndex8_Config,     //!< 8-bits per pixel, using SkColorTable to specify the colors
530910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        kRGB_565_Config,    //!< 16-bits per pixel, (see SkColorPriv.h for packing)
540910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        kARGB_4444_Config,  //!< 16-bits per pixel, (see SkColorPriv.h for packing)
550910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        kARGB_8888_Config,  //!< 32-bits per pixel, (see SkColorPriv.h for packing)
5640528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger        /**
5740528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger         *  Custom compressed format, not supported on all platforms.
5840528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger         *  Cannot be used as a destination (target of a canvas).
5940528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger         *  i.e. you may be able to draw from one, but you cannot draw into one.
6040528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger         */
610910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        kRLE_Index8_Config,
620910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
630910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        kConfigCount
640910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    };
650910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
660910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    /** Default construct creates a bitmap with zero width and height, and no pixels.
670910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        Its config is set to kNo_Config.
680910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    */
690910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkBitmap();
700910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    /** Constructor initializes the new bitmap by copying the src bitmap. All fields are copied,
710910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        but ownership of the pixels remains with the src bitmap.
720910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    */
730910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkBitmap(const SkBitmap& src);
740910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    /** Decrements our (shared) pixel ownership if needed.
750910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    */
760910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    ~SkBitmap();
770910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
780910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    /** Copies the src bitmap into this bitmap. Ownership of the src bitmap's pixels remains
790910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        with the src bitmap.
800910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    */
810910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkBitmap& operator=(const SkBitmap& src);
820910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    /** Swap the fields of the two bitmaps. This routine is guaranteed to never fail or throw.
830910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    */
840910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    //  This method is not exported to java.
850910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    void swap(SkBitmap& other);
8611285a304c143d1bdf3a1e321803cfcc8a6a938cMike Reed
870910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    /** Return true iff the bitmap has empty dimensions.
880910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    */
890910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    bool empty() const { return 0 == fWidth || 0 == fHeight; }
9011285a304c143d1bdf3a1e321803cfcc8a6a938cMike Reed
910910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    /** Return true iff the bitmap has no pixels nor a pixelref. Note: this can
920910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        return true even if the dimensions of the bitmap are > 0 (see empty()).
930910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    */
940910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    bool isNull() const { return NULL == fPixels && NULL == fPixelRef; }
950910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
960910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    /** Return the config for the bitmap.
970910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    */
980910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    Config  config() const { return (Config)fConfig; }
990910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    /** DEPRECATED, use config()
1000910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    */
1010910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    Config  getConfig() const { return this->config(); }
1020910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    /** Return the bitmap's width, in pixels.
1030910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    */
1040910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    int width() const { return fWidth; }
1050910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    /** Return the bitmap's height, in pixels.
1060910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    */
1070910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    int height() const { return fHeight; }
1080910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    /** Return the number of bytes between subsequent rows of the bitmap.
1090910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    */
1100910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    int rowBytes() const { return fRowBytes; }
11111285a304c143d1bdf3a1e321803cfcc8a6a938cMike Reed
1120910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    /** Return the shift amount per pixel (i.e. 0 for 1-byte per pixel, 1 for
1130910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        2-bytes per pixel configs, 2 for 4-bytes per pixel configs). Return 0
1140910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        for configs that are not at least 1-byte per pixel (e.g. kA1_Config
1150910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        or kNo_Config)
1160910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    */
1170910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    int shiftPerPixel() const { return fBytesPerPixel >> 1; }
1180910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1190910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    /** Return the number of bytes per pixel based on the config. If the config
1200910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        does not have at least 1 byte per (e.g. kA1_Config) then 0 is returned.
1210910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    */
1220910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    int bytesPerPixel() const { return fBytesPerPixel; }
1230910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1240910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    /** Return the rowbytes expressed as a number of pixels (like width and
1250910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        height). Note, for 1-byte per pixel configs like kA8_Config, this will
1260910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        return the same as rowBytes(). Is undefined for configs that are less
1270910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        than 1-byte per pixel (e.g. kA1_Config)
1280910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    */
1290910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    int rowBytesAsPixels() const { return fRowBytes >> (fBytesPerPixel >> 1); }
1300910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1310910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    /** Return the address of the pixels for this SkBitmap.
1320910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    */
1330910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    void* getPixels() const { return fPixels; }
1340910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1350910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    /** Return the byte size of the pixels, based on the height and rowBytes.
1360910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        Note this truncates the result to 32bits. Call getSize64() to detect
1370910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        if the real size exceeds 32bits.
1380910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    */
1390910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    size_t getSize() const { return fHeight * fRowBytes; }
14011285a304c143d1bdf3a1e321803cfcc8a6a938cMike Reed
14140528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger    /** Return the number of bytes from the pointer returned by getPixels()
14240528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger        to the end of the allocated space in the buffer. Required in
14340528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger        cases where extractBitmap has been called.
14440528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger    */
14540528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger    size_t getSafeSize() const ;
14640528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger
1470910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    /** Return the byte size of the pixels, based on the height and rowBytes.
1480910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        This routine is slightly slower than getSize(), but does not truncate
1490910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        the answer to 32bits.
1500910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    */
1510910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    Sk64 getSize64() const {
1520910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        Sk64 size;
1530910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        size.setMul(fHeight, fRowBytes);
1540910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        return size;
1550910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    }
15611285a304c143d1bdf3a1e321803cfcc8a6a938cMike Reed
15740528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger    /** Same as getSafeSize(), but does not truncate the answer to 32bits.
15840528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger    */
15940528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger    Sk64 getSafeSize64() const ;
16040528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger
1611cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    /** Returns true if this bitmap is marked as immutable, meaning that the
1621cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        contents of its pixels will not change for the lifetime of the bitmap.
1631cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    */
1641cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    bool isImmutable() const;
1651cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
1661cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    /** Marks this bitmap as immutable, meaning that the contents of its
1671cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        pixels will not change for the lifetime of the bitmap and of the
1681cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        underlying pixelref. This state can be set, but it cannot be
1691cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        cleared once it is set. This state propagates to all other bitmaps
1701cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        that share the same pixelref.
1711cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    */
1721cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    void setImmutable();
1731cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
1740910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    /** Returns true if the bitmap is opaque (has no translucent/transparent pixels).
1750910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    */
1760910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    bool isOpaque() const;
1771cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
1780910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    /** Specify if this bitmap's pixels are all opaque or not. Is only meaningful for configs
1790910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        that support per-pixel alpha (RGB32, A1, A8).
1800910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    */
1810910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    void setIsOpaque(bool);
1820910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1831cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    /** Returns true if the bitmap is volatile (i.e. should not be cached by devices.)
1841cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    */
1851cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    bool isVolatile() const;
1861cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
1871cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    /** Specify whether this bitmap is volatile. Bitmaps are not volatile by
1881cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        default. Temporary bitmaps that are discarded after use should be
1891cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        marked as volatile. This provides a hint to the device that the bitmap
1901cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        should not be cached. Providing this hint when appropriate can
1911cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        improve performance by avoiding unnecessary overhead and resource
1921cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        consumption on the device.
1931cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    */
1941cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    void setIsVolatile(bool);
1951cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
1960910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    /** Reset the bitmap to its initial state (see default constructor). If we are a (shared)
1970910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        owner of the pixels, that ownership is decremented.
1980910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    */
1990910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    void reset();
2000910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
2010910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    /** Given a config and a width, this computes the optimal rowBytes value. This is called automatically
2020910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        if you pass 0 for rowBytes to setConfig().
2030910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    */
2040910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    static int ComputeRowBytes(Config c, int width);
2050910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
2060910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    /** Return the bytes-per-pixel for the specified config. If the config is
2070910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        not at least 1-byte per pixel, return 0, including for kNo_Config.
2080910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    */
2090910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    static int ComputeBytesPerPixel(Config c);
2100910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
2110910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    /** Return the shift-per-pixel for the specified config. If the config is
2120910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project     not at least 1-byte per pixel, return 0, including for kNo_Config.
2130910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project     */
2140910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    static int ComputeShiftPerPixel(Config c) {
2150910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        return ComputeBytesPerPixel(c) >> 1;
2160910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    }
21711285a304c143d1bdf3a1e321803cfcc8a6a938cMike Reed
2180910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    static Sk64 ComputeSize64(Config, int width, int height);
2190910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    static size_t ComputeSize(Config, int width, int height);
2200910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
2210910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    /** Set the bitmap's config and dimensions. If rowBytes is 0, then
2220910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        ComputeRowBytes() is called to compute the optimal value. This resets
2230910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        any pixel/colortable ownership, just like reset().
2240910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    */
2250910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    void setConfig(Config, int width, int height, int rowBytes = 0);
2260910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    /** Use this to assign a new pixel address for an existing bitmap. This
2270910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        will automatically release any pixelref previously installed. Only call
2280910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        this if you are handling ownership/lifetime of the pixel memory.
22911285a304c143d1bdf3a1e321803cfcc8a6a938cMike Reed
2300910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        If the bitmap retains a reference to the colortable (assuming it is
2310910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        not null) it will take care of incrementing the reference count.
2320910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
2330910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param pixels   Address for the pixels, managed by the caller.
2340910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param ctable   ColorTable (or null) that matches the specified pixels
2350910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    */
2360910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    void setPixels(void* p, SkColorTable* ctable = NULL);
2370910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
23840528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger    /** Copies the bitmap's pixels to the location pointed at by dst and returns
23940528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger        true if possible, returns false otherwise.
24040528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger
2411cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        In the case when the dstRowBytes matches the bitmap's rowBytes, the copy
2421cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        may be made faster by copying over the dst's per-row padding (for all
2431cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        rows but the last). By setting preserveDstPad to true the caller can
2441cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        disable this optimization and ensure that pixels in the padding are not
2451cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        overwritten.
24640528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger
24740528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger        Always returns false for RLE formats.
24840528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger
24940528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger        @param dst      Location of destination buffer.
25040528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger        @param dstSize  Size of destination buffer. Must be large enough to hold
25140528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger                        pixels using indicated stride.
25240528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger        @param dstRowBytes  Width of each line in the buffer. If -1, uses
25340528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger                            bitmap's internal stride.
2541cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        @param preserveDstPad Must we preserve padding in the dst
25540528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger    */
2561cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    bool copyPixelsTo(void* const dst, size_t dstSize, int dstRowBytes = -1,
2571cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                      bool preserveDstPad = false)
25840528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger         const;
25940528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger
2600910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    /** Use the standard HeapAllocator to create the pixelref that manages the
2610910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        pixel memory. It will be sized based on the current width/height/config.
2620910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        If this is called multiple times, a new pixelref object will be created
2630910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        each time.
26411285a304c143d1bdf3a1e321803cfcc8a6a938cMike Reed
2650910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        If the bitmap retains a reference to the colortable (assuming it is
2660910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        not null) it will take care of incrementing the reference count.
2670910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
2680910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param ctable   ColorTable (or null) to use with the pixels that will
2690910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                        be allocated. Only used if config == Index8_Config
2700910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @return true if the allocation succeeds. If not the pixelref field of
2710910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                     the bitmap will be unchanged.
2720910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    */
2730910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    bool allocPixels(SkColorTable* ctable = NULL) {
2740910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        return this->allocPixels(NULL, ctable);
2750910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    }
27611285a304c143d1bdf3a1e321803cfcc8a6a938cMike Reed
2770910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    /** Use the specified Allocator to create the pixelref that manages the
2780910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        pixel memory. It will be sized based on the current width/height/config.
2790910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        If this is called multiple times, a new pixelref object will be created
2800910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        each time.
28111285a304c143d1bdf3a1e321803cfcc8a6a938cMike Reed
2820910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        If the bitmap retains a reference to the colortable (assuming it is
2830910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        not null) it will take care of incrementing the reference count.
28411285a304c143d1bdf3a1e321803cfcc8a6a938cMike Reed
2850910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param allocator The Allocator to use to create a pixelref that can
2860910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                         manage the pixel memory for the current
2870910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                         width/height/config. If allocator is NULL, the standard
2880910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                         HeapAllocator will be used.
2890910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param ctable   ColorTable (or null) to use with the pixels that will
2900910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                        be allocated. Only used if config == Index8_Config.
2910910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                        If it is non-null and the config is not Index8, it will
2920910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                        be ignored.
2930910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @return true if the allocation succeeds. If not the pixelref field of
2940910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                     the bitmap will be unchanged.
2950910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    */
2960910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    bool allocPixels(Allocator* allocator, SkColorTable* ctable);
29711285a304c143d1bdf3a1e321803cfcc8a6a938cMike Reed
29840528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger    /** Return the current pixelref object, if any
2990910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    */
3000910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkPixelRef* pixelRef() const { return fPixelRef; }
3010910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    /** Return the offset into the pixelref, if any. Will return 0 if there is
3020910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        no pixelref installed.
3030910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    */
3040910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    size_t pixelRefOffset() const { return fPixelRefOffset; }
3050910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    /** Assign a pixelref and optional offset. Pixelrefs are reference counted,
3060910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        so the existing one (if any) will be unref'd and the new one will be
3070910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        ref'd.
3080910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    */
3090910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkPixelRef* setPixelRef(SkPixelRef* pr, size_t offset = 0);
31011285a304c143d1bdf3a1e321803cfcc8a6a938cMike Reed
3110910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    /** Call this to ensure that the bitmap points to the current pixel address
3120910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        in the pixelref. Balance it with a call to unlockPixels(). These calls
3130910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        are harmless if there is no pixelref.
3140910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    */
3150910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    void lockPixels() const;
3160910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    /** When you are finished access the pixel memory, call this to balance a
3170910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        previous call to lockPixels(). This allows pixelrefs that implement
3180910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        cached/deferred image decoding to know when there are active clients of
3190910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        a given image.
3200910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    */
3210910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    void unlockPixels() const;
32211285a304c143d1bdf3a1e321803cfcc8a6a938cMike Reed
3231cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    /**
3241cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *  Some bitmaps can return a copy of their pixels for lockPixels(), but
3251cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *  that copy, if modified, will not be pushed back. These bitmaps should
3261cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *  not be used as targets for a raster device/canvas (since all pixels
3271cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *  modifications will be lost when unlockPixels() is called.)
3281cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     */
3291cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    bool lockPixelsAreWritable() const;
3301cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
3310910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    /** Call this to be sure that the bitmap is valid enough to be drawn (i.e.
3320910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        it has non-null pixels, and if required by its config, it has a
3330910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        non-null colortable. Returns true if all of the above are met.
3340910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    */
3350910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    bool readyToDraw() const {
3360910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        return this->getPixels() != NULL &&
33740528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger               ((this->config() != kIndex8_Config &&
33840528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger                 this->config() != kRLE_Index8_Config) ||
3390910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                       fColorTable != NULL);
3400910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    }
3410910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
34240528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger    /** Returns the pixelRef's texture, or NULL
34340528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger     */
34440528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger    SkGpuTexture* getTexture() const;
34540528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger
3460910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    /** Return the bitmap's colortable (if any). Does not affect the colortable's
3470910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        reference count.
3480910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    */
3490910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkColorTable* getColorTable() const { return fColorTable; }
3500910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
3510910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    /** Returns a non-zero, unique value corresponding to the pixels in our
35235e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger        pixelref (or raw pixels set via setPixels). Each time the pixels are
3530910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        changed (and notifyPixelsChanged is called), a different generation ID
3540910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        will be returned.
3550910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    */
3560910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    uint32_t getGenerationID() const;
35711285a304c143d1bdf3a1e321803cfcc8a6a938cMike Reed
3580910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    /** Call this if you have changed the contents of the pixels. This will in-
3590910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        turn cause a different generation ID value to be returned from
3600910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        getGenerationID().
3610910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    */
3620910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    void notifyPixelsChanged() const;
3630910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
3640910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    /** Initialize the bitmap's pixels with the specified color+alpha, automatically converting into the correct format
3650910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        for the bitmap's config. If the config is kRGB_565_Config, then the alpha value is ignored.
3660910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        If the config is kA8_Config, then the r,g,b parameters are ignored.
3670910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    */
3680910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    void eraseARGB(U8CPU a, U8CPU r, U8CPU g, U8CPU b) const;
3690910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    /** Initialize the bitmap's pixels with the specified color+alpha, automatically converting into the correct format
3700910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        for the bitmap's config. If the config is kRGB_565_Config, then the alpha value is presumed
3710910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        to be 0xFF. If the config is kA8_Config, then the r,g,b parameters are ignored and the
3720910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        pixels are all set to 0xFF.
3730910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    */
3740910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    void eraseRGB(U8CPU r, U8CPU g, U8CPU b) const {
3750910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        this->eraseARGB(0xFF, r, g, b);
3760910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    }
3770910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    /** Initialize the bitmap's pixels with the specified color, automatically converting into the correct format
3780910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        for the bitmap's config. If the config is kRGB_565_Config, then the color's alpha value is presumed
3790910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        to be 0xFF. If the config is kA8_Config, then only the color's alpha value is used.
3800910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    */
3810910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    void eraseColor(SkColor c) const {
3820910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        this->eraseARGB(SkColorGetA(c), SkColorGetR(c), SkColorGetG(c),
3830910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                        SkColorGetB(c));
3840910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    }
38511285a304c143d1bdf3a1e321803cfcc8a6a938cMike Reed
3860910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    /** Scroll (a subset of) the contents of this bitmap by dx/dy. If there are
3870910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        no pixels allocated (i.e. getPixels() returns null) the method will
3880910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        still update the inval region (if present).
3890910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
3900910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param subset The subset of the bitmap to scroll/move. To scroll the
3910910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                      entire contents, specify [0, 0, width, height] or just
3920910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                      pass null.
3930910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param dx The amount to scroll in X
3940910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param dy The amount to scroll in Y
3950910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param inval Optional (may be null). Returns the area of the bitmap that
3960910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                     was scrolled away. E.g. if dx = dy = 0, then inval would
3970910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                     be set to empty. If dx >= width or dy >= height, then
3980910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                     inval would be set to the entire bounds of the bitmap.
3990910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @return true if the scroll was doable. Will return false if the bitmap
4000910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                     uses an unsupported config for scrolling (only kA8,
4010910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                     kIndex8, kRGB_565, kARGB_4444, kARGB_8888 are supported).
4020910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                     If no pixels are present (i.e. getPixels() returns false)
4030910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                     inval will still be updated, and true will be returned.
4040910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    */
4050910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    bool scrollRect(const SkIRect* subset, int dx, int dy,
4060910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                    SkRegion* inval = NULL) const;
4070910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
40835e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger    /**
40935e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger     *  Return the SkColor of the specified pixel.  In most cases this will
41035e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger     *  require un-premultiplying the color.  Alpha only configs (A1 and A8)
41135e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger     *  return black with the appropriate alpha set.  The value is undefined
41235e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger     *  for kNone_Config or if x or y are out of bounds, or if the bitmap
41335e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger     *  does not have any pixels (or has not be locked with lockPixels()).
41435e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger     */
41535e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger    SkColor getColor(int x, int y) const;
41635e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger
4170910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    /** Returns the address of the specified pixel. This performs a runtime
4180910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        check to know the size of the pixels, and will return the same answer
4190910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        as the corresponding size-specific method (e.g. getAddr16). Since the
4200910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        check happens at runtime, it is much slower than using a size-specific
4210910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        version. Unlike the size-specific methods, this routine also checks if
4220910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        getPixels() returns null, and returns that. The size-specific routines
4230910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        perform a debugging assert that getPixels() is not null, but they do
4240910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        not do any runtime checks.
4250910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    */
4260910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    void* getAddr(int x, int y) const;
4270910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
4280910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    /** Returns the address of the pixel specified by x,y for 32bit pixels.
42935e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger     *  In debug build, this asserts that the pixels are allocated and locked,
43035e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger     *  and that the config is 32-bit, however none of these checks are performed
43135e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger     *  in the release build.
43235e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger     */
4330910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    inline uint32_t* getAddr32(int x, int y) const;
43435e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger
4350910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    /** Returns the address of the pixel specified by x,y for 16bit pixels.
43635e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger     *  In debug build, this asserts that the pixels are allocated and locked,
43735e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger     *  and that the config is 16-bit, however none of these checks are performed
43835e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger     *  in the release build.
43935e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger     */
4400910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    inline uint16_t* getAddr16(int x, int y) const;
44135e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger
4420910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    /** Returns the address of the pixel specified by x,y for 8bit pixels.
44335e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger     *  In debug build, this asserts that the pixels are allocated and locked,
44435e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger     *  and that the config is 8-bit, however none of these checks are performed
44535e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger     *  in the release build.
44635e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger     */
4470910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    inline uint8_t* getAddr8(int x, int y) const;
44835e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger
4490910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    /** Returns the address of the byte containing the pixel specified by x,y
45035e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger     *  for 1bit pixels.
45135e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger     *  In debug build, this asserts that the pixels are allocated and locked,
45235e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger     *  and that the config is 1-bit, however none of these checks are performed
45335e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger     *  in the release build.
45435e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger     */
4550910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    inline uint8_t* getAddr1(int x, int y) const;
4560910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
4570910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    /** Returns the color corresponding to the pixel specified by x,y for
45835e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger     *  colortable based bitmaps.
45935e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger     *  In debug build, this asserts that the pixels are allocated and locked,
46035e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger     *  that the config is kIndex8, and that the colortable is allocated,
46135e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger     *  however none of these checks are performed in the release build.
46235e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger     */
4630910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    inline SkPMColor getIndex8Color(int x, int y) const;
4640910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
4650910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    /** Set dst to be a setset of this bitmap. If possible, it will share the
4660910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        pixel memory, and just point into a subset of it. However, if the config
4670910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        does not support this, a local copy will be made and associated with
4680910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        the dst bitmap. If the subset rectangle, intersected with the bitmap's
4690910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        dimensions is empty, or if there is an unsupported config, false will be
4700910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        returned and dst will be untouched.
4710910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param dst  The bitmap that will be set to a subset of this bitmap
4720910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param subset The rectangle of pixels in this bitmap that dst will
4730910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                      reference.
4740910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @return true if the subset copy was successfully made.
4750910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    */
4760910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    bool extractSubset(SkBitmap* dst, const SkIRect& subset) const;
4770910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
4781cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    /** Makes a deep copy of this bitmap, respecting the requested config,
4791cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *  and allocating the dst pixels on the cpu.
4801cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *  Returns false if either there is an error (i.e. the src does not have
4811cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *  pixels) or the request cannot be satisfied (e.g. the src has per-pixel
4821cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *  alpha, and the requested config does not support alpha).
4831cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *  @param dst The bitmap to be sized and allocated
4841cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *  @param c The desired config for dst
4851cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *  @param allocator Allocator used to allocate the pixelref for the dst
4861cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *                   bitmap. If this is null, the standard HeapAllocator
4871cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *                   will be used.
4881cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *  @return true if the copy could be made.
4891cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     */
4900910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    bool copyTo(SkBitmap* dst, Config c, Allocator* allocator = NULL) const;
4910910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
4921cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    /** Makes a deep copy of this bitmap, respecting the requested config, and
4931cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *  with custom allocation logic that will keep the copied pixels
4941cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *  in the same domain as the source: If the src pixels are allocated for
4951cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *  the cpu, then so will the dst. If the src pixels are allocated on the
4961cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *  gpu (typically as a texture), the it will do the same for the dst.
4971cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *  If the request cannot be fulfilled, returns false and dst is unmodified.
4981cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     */
4991cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    bool deepCopyTo(SkBitmap* dst, Config c) const;
5001cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
501dab163f0b2658c2dba48839e72f81d3d8ee0ae8bMike Reed    /** Returns true if this bitmap can be deep copied into the requested config
502dab163f0b2658c2dba48839e72f81d3d8ee0ae8bMike Reed        by calling copyTo().
503dab163f0b2658c2dba48839e72f81d3d8ee0ae8bMike Reed     */
504dab163f0b2658c2dba48839e72f81d3d8ee0ae8bMike Reed    bool canCopyTo(Config newConfig) const;
505dab163f0b2658c2dba48839e72f81d3d8ee0ae8bMike Reed
5060910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    bool hasMipMap() const;
5070910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    void buildMipMap(bool forceRebuild = false);
5080910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    void freeMipMap();
5090910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
5100910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    /** Given scale factors sx, sy, determine the miplevel available in the
5110910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        bitmap, and return it (this is the amount to shift matrix iterators
5120910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        by). If dst is not null, it is set to the correct level.
5130910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    */
5140910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    int extractMipLevel(SkBitmap* dst, SkFixed sx, SkFixed sy);
5150910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
5167cd90d4eecdba0f40a36945749d40df95d6d641bRomain Guy#ifdef SK_BUILD_FOR_ANDROID
5177cd90d4eecdba0f40a36945749d40df95d6d641bRomain Guy    bool hasHardwareMipMap() const {
5187cd90d4eecdba0f40a36945749d40df95d6d641bRomain Guy        return fHasHardwareMipMap;
5197cd90d4eecdba0f40a36945749d40df95d6d641bRomain Guy    }
5207cd90d4eecdba0f40a36945749d40df95d6d641bRomain Guy
5217cd90d4eecdba0f40a36945749d40df95d6d641bRomain Guy    void setHasHardwareMipMap(bool hasHardwareMipMap) {
5227cd90d4eecdba0f40a36945749d40df95d6d641bRomain Guy        fHasHardwareMipMap = hasHardwareMipMap;
5237cd90d4eecdba0f40a36945749d40df95d6d641bRomain Guy    }
5247cd90d4eecdba0f40a36945749d40df95d6d641bRomain Guy#endif
5257cd90d4eecdba0f40a36945749d40df95d6d641bRomain Guy
52605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    bool extractAlpha(SkBitmap* dst) const {
52705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger        return this->extractAlpha(dst, NULL, NULL, NULL);
5280910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    }
5290910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
53005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    bool extractAlpha(SkBitmap* dst, const SkPaint* paint,
531bdc1207aa05f2f1b013e937f9cbe4795768eaa74Patrick Dubroy                      SkIPoint* offset) const {
53205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger        return this->extractAlpha(dst, paint, NULL, offset);
533bdc1207aa05f2f1b013e937f9cbe4795768eaa74Patrick Dubroy    }
534bdc1207aa05f2f1b013e937f9cbe4795768eaa74Patrick Dubroy
535800e1ff0b9eaff0b02ce711bb7f22f2149141c9eEric Hassold    /** Set dst to contain alpha layer of this bitmap. If destination bitmap
536800e1ff0b9eaff0b02ce711bb7f22f2149141c9eEric Hassold        fails to be initialized, e.g. because allocator can't allocate pixels
53705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger        for it, dst will not be modified and false will be returned.
538800e1ff0b9eaff0b02ce711bb7f22f2149141c9eEric Hassold
539800e1ff0b9eaff0b02ce711bb7f22f2149141c9eEric Hassold        @param dst The bitmap to be filled with alpha layer
540800e1ff0b9eaff0b02ce711bb7f22f2149141c9eEric Hassold        @param paint The paint to draw with
541800e1ff0b9eaff0b02ce711bb7f22f2149141c9eEric Hassold        @param allocator Allocator used to allocate the pixelref for the dst
542800e1ff0b9eaff0b02ce711bb7f22f2149141c9eEric Hassold                         bitmap. If this is null, the standard HeapAllocator
543800e1ff0b9eaff0b02ce711bb7f22f2149141c9eEric Hassold                         will be used.
544800e1ff0b9eaff0b02ce711bb7f22f2149141c9eEric Hassold        @param offset If not null, it is set to top-left coordinate to position
545800e1ff0b9eaff0b02ce711bb7f22f2149141c9eEric Hassold                      the returned bitmap so that it visually lines up with the
546800e1ff0b9eaff0b02ce711bb7f22f2149141c9eEric Hassold                      original
547800e1ff0b9eaff0b02ce711bb7f22f2149141c9eEric Hassold    */
54805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    bool extractAlpha(SkBitmap* dst, const SkPaint* paint, Allocator* allocator,
5490910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                      SkIPoint* offset) const;
55011285a304c143d1bdf3a1e321803cfcc8a6a938cMike Reed
5510910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    void flatten(SkFlattenableWriteBuffer&) const;
5520910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    void unflatten(SkFlattenableReadBuffer&);
5530910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
5540910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkDEBUGCODE(void validate() const;)
5550910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
5560910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    class Allocator : public SkRefCnt {
5570910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    public:
5580910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        /** Allocate the pixel memory for the bitmap, given its dimensions and
5590910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            config. Return true on success, where success means either setPixels
5600910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            or setPixelRef was called. The pixels need not be locked when this
5610910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            returns. If the config requires a colortable, it also must be
5620910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            installed via setColorTable. If false is returned, the bitmap and
5630910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            colortable should be left unchanged.
5640910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        */
5650910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        virtual bool allocPixelRef(SkBitmap*, SkColorTable*) = 0;
5660910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    };
5670910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
5680910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    /** Subclass of Allocator that returns a pixelref that allocates its pixel
5690910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        memory from the heap. This is the default Allocator invoked by
5700910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        allocPixels().
5710910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    */
5720910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    class HeapAllocator : public Allocator {
5730910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    public:
5740910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        virtual bool allocPixelRef(SkBitmap*, SkColorTable*);
5750910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    };
5760910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
5770910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    class RLEPixels {
5780910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    public:
5790910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        RLEPixels(int width, int height);
5800910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        virtual ~RLEPixels();
58111285a304c143d1bdf3a1e321803cfcc8a6a938cMike Reed
5820910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        uint8_t* packedAtY(int y) const {
5830910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            SkASSERT((unsigned)y < (unsigned)fHeight);
5840910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            return fYPtrs[y];
5850910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        }
58611285a304c143d1bdf3a1e321803cfcc8a6a938cMike Reed
5870910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        // called by subclasses during creation
5880910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        void setPackedAtY(int y, uint8_t* addr) {
5890910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            SkASSERT((unsigned)y < (unsigned)fHeight);
5900910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            fYPtrs[y] = addr;
5910910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        }
59211285a304c143d1bdf3a1e321803cfcc8a6a938cMike Reed
5930910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    private:
5940910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        uint8_t** fYPtrs;
5950910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        int       fHeight;
5960910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    };
59711285a304c143d1bdf3a1e321803cfcc8a6a938cMike Reed
5980910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectprivate:
5990910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    struct MipMap;
6000910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    mutable MipMap* fMipMap;
6010910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
6020910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    mutable SkPixelRef* fPixelRef;
6030910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    mutable size_t      fPixelRefOffset;
6040910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    mutable int         fPixelLockCount;
6050910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    // either user-specified (in which case it is not treated as mutable)
6060910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    // or a cache of the returned value from fPixelRef->lockPixels()
6070910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    mutable void*       fPixels;
6080910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    mutable SkColorTable* fColorTable;    // only meaningful for kIndex8
60935e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger    // When there is no pixel ref (setPixels was called) we still need a
61035e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger    // gen id for SkDevice implementations that may cache a copy of the
61135e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger    // pixels (e.g. as a gpu texture)
61235e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger    mutable int         fRawPixelGenerationID;
6130910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
6140910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    enum Flags {
6151cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        kImageIsOpaque_Flag     = 0x01,
6161cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        kImageIsVolatile_Flag   = 0x02,
6171cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        kImageIsImmutable_Flag  = 0x04
6180910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    };
6190910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
6200910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    uint32_t    fRowBytes;
621d7cda4273e6b2dcca5bb9215121f5117fb261c18Mike Reed    uint32_t    fWidth;
622d7cda4273e6b2dcca5bb9215121f5117fb261c18Mike Reed    uint32_t    fHeight;
6230910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    uint8_t     fConfig;
6240910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    uint8_t     fFlags;
6250910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    uint8_t     fBytesPerPixel; // based on config
6260910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
6277cd90d4eecdba0f40a36945749d40df95d6d641bRomain Guy#ifdef SK_BUILD_FOR_ANDROID
6287cd90d4eecdba0f40a36945749d40df95d6d641bRomain Guy    bool fHasHardwareMipMap;
6297cd90d4eecdba0f40a36945749d40df95d6d641bRomain Guy#endif
6307cd90d4eecdba0f40a36945749d40df95d6d641bRomain Guy
63140528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger    /* Internal computations for safe size.
63240528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger    */
63340528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger    static Sk64 ComputeSafeSize64(Config config,
63440528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger                                  uint32_t width,
63540528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger                                  uint32_t height,
63640528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger                                  uint32_t rowBytes);
63740528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger    static size_t ComputeSafeSize(Config   config,
63840528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger                                  uint32_t width,
63940528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger                                  uint32_t height,
64040528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger                                  uint32_t rowBytes);
64140528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger
6420910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    /*  Unreference any pixelrefs or colortables
6430910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    */
6440910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    void freePixels();
6450910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    void updatePixelsFromRef() const;
64611285a304c143d1bdf3a1e321803cfcc8a6a938cMike Reed
6470910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    static SkFixed ComputeMipLevel(SkFixed sx, SkFixed dy);
6480910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project};
6490910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
6500910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project/** \class SkColorTable
6510910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
6520910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkColorTable holds an array SkPMColors (premultiplied 32-bit colors) used by
6530910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    8-bit bitmaps, where the bitmap bytes are interpreted as indices into the colortable.
6540910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project*/
6550910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectclass SkColorTable : public SkRefCnt {
6560910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectpublic:
65711285a304c143d1bdf3a1e321803cfcc8a6a938cMike Reed    /** Makes a deep copy of colors.
65811285a304c143d1bdf3a1e321803cfcc8a6a938cMike Reed     */
65911285a304c143d1bdf3a1e321803cfcc8a6a938cMike Reed    SkColorTable(const SkColorTable& src);
66011285a304c143d1bdf3a1e321803cfcc8a6a938cMike Reed    /** Preallocates the colortable to have 'count' colors, which
66111285a304c143d1bdf3a1e321803cfcc8a6a938cMike Reed     *  are initially set to 0.
6620910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    */
6630910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    explicit SkColorTable(int count);
6640910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    explicit SkColorTable(SkFlattenableReadBuffer&);
6650910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkColorTable(const SkPMColor colors[], int count);
6660910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    virtual ~SkColorTable();
6670910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
6680910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    enum Flags {
6690910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        kColorsAreOpaque_Flag   = 0x01  //!< if set, all of the colors in the table are opaque (alpha==0xFF)
6700910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    };
6710910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    /** Returns the flag bits for the color table. These can be changed with setFlags().
6720910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    */
6730910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    unsigned getFlags() const { return fFlags; }
6740910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    /** Set the flags for the color table. See the Flags enum for possible values.
6750910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    */
6760910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    void    setFlags(unsigned flags);
6770910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
6783026a9ec59b285412941d278a570e382088f8adaMike Reed    bool isOpaque() const { return (fFlags & kColorsAreOpaque_Flag) != 0; }
6793026a9ec59b285412941d278a570e382088f8adaMike Reed    void setIsOpaque(bool isOpaque);
6803026a9ec59b285412941d278a570e382088f8adaMike Reed
6810910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    /** Returns the number of colors in the table.
6820910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    */
6830910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    int count() const { return fCount; }
6840910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
6850910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    /** Returns the specified color from the table. In the debug build, this asserts that
6860910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        the index is in range (0 <= index < count).
6870910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    */
6880910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkPMColor operator[](int index) const {
6890910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        SkASSERT(fColors != NULL && (unsigned)index < fCount);
6900910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        return fColors[index];
6910910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    }
6920910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
6930910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    /** Specify the number of colors in the color table. This does not initialize the colors
6940910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        to any value, just allocates memory for them. To initialize the values, either call
6950910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        setColors(array, count), or follow setCount(count) with a call to
6960910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        lockColors()/{set the values}/unlockColors(true).
6970910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    */
6980910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project//    void    setColors(int count) { this->setColors(NULL, count); }
6990910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project//    void    setColors(const SkPMColor[], int count);
7000910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
7010910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    /** Return the array of colors for reading and/or writing. This must be
7020910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        balanced by a call to unlockColors(changed?), telling the colortable if
7030910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        the colors were changed during the lock.
7040910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    */
7050910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkPMColor* lockColors() {
7060910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        SkDEBUGCODE(fColorLockCount += 1;)
7070910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        return fColors;
7080910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    }
7090910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    /** Balancing call to lockColors(). If the colors have been changed, pass true.
7100910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    */
7110910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    void unlockColors(bool changed);
7120910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
7130910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    /** Similar to lockColors(), lock16BitCache() returns the array of
7140910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        RGB16 colors that mirror the 32bit colors. However, this function
7150910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        will return null if kColorsAreOpaque_Flag is not set.
7160910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        Also, unlike lockColors(), the returned array here cannot be modified.
7170910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    */
7180910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    const uint16_t* lock16BitCache();
7190910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    /** Balancing call to lock16BitCache().
7200910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    */
7210910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    void unlock16BitCache() {
7220910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        SkASSERT(f16BitCacheLockCount > 0);
7230910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        SkDEBUGCODE(f16BitCacheLockCount -= 1);
7240910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    }
7250910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
7260910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    void flatten(SkFlattenableWriteBuffer&) const;
7270910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
7280910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectprivate:
7290910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkPMColor*  fColors;
7300910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    uint16_t*   f16BitCache;
7310910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    uint16_t    fCount;
7320910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    uint8_t     fFlags;
7330910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkDEBUGCODE(int fColorLockCount;)
7340910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkDEBUGCODE(int f16BitCacheLockCount;)
7350910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
7360910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    void inval16BitCache();
7370910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project};
7380910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
7391cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerclass SkAutoLockPixels : public SkNoncopyable {
7400910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectpublic:
7411cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    SkAutoLockPixels(const SkBitmap& bm, bool doLock = true) : fBitmap(bm) {
7421cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        fDidLock = doLock;
7431cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        if (doLock) {
7441cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            bm.lockPixels();
7451cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        }
7460910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    }
7470910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    ~SkAutoLockPixels() {
7481cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        if (fDidLock) {
7491cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            fBitmap.unlockPixels();
7501cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        }
7510910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    }
7520910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
7530910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectprivate:
7540910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    const SkBitmap& fBitmap;
7551cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    bool            fDidLock;
7560910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project};
7570910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
7580910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project/** Helper class that performs the lock/unlockColors calls on a colortable.
7590910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    The destructor will call unlockColors(false) if it has a bitmap's colortable
7600910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project*/
7610910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectclass SkAutoLockColors : public SkNoncopyable {
7620910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectpublic:
7630910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    /** Initialize with no bitmap. Call lockColors(bitmap) to lock bitmap's
7640910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        colortable
7650910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project     */
7660910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkAutoLockColors() : fCTable(NULL), fColors(NULL) {}
7670910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    /** Initialize with bitmap, locking its colortable if present
7680910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project     */
7690910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    explicit SkAutoLockColors(const SkBitmap& bm) {
7700910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        fCTable = bm.getColorTable();
7710910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        fColors = fCTable ? fCTable->lockColors() : NULL;
7720910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    }
7730910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    /** Initialize with a colortable (may be null)
7740910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project     */
7750910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    explicit SkAutoLockColors(SkColorTable* ctable) {
7760910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        fCTable = ctable;
7770910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        fColors = ctable ? ctable->lockColors() : NULL;
7780910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    }
7790910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    ~SkAutoLockColors() {
7800910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        if (fCTable) {
7810910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            fCTable->unlockColors(false);
7820910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        }
7830910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    }
78411285a304c143d1bdf3a1e321803cfcc8a6a938cMike Reed
7850910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    /** Return the currently locked colors, or NULL if no bitmap's colortable
7860910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        is currently locked.
7870910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    */
7880910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    const SkPMColor* colors() const { return fColors; }
78911285a304c143d1bdf3a1e321803cfcc8a6a938cMike Reed
790e762975133c7c9f529b996b3b1fee8b8910dc650Mike Reed    /** Locks the table and returns is colors (assuming ctable is not null) and
791e762975133c7c9f529b996b3b1fee8b8910dc650Mike Reed        unlocks the previous table if one was present
792e762975133c7c9f529b996b3b1fee8b8910dc650Mike Reed     */
793e762975133c7c9f529b996b3b1fee8b8910dc650Mike Reed    const SkPMColor* lockColors(SkColorTable* ctable) {
7940910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        if (fCTable) {
7950910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            fCTable->unlockColors(false);
7960910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        }
797e762975133c7c9f529b996b3b1fee8b8910dc650Mike Reed        fCTable = ctable;
798e762975133c7c9f529b996b3b1fee8b8910dc650Mike Reed        fColors = ctable ? ctable->lockColors() : NULL;
7990910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        return fColors;
8000910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    }
8010910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
802e762975133c7c9f529b996b3b1fee8b8910dc650Mike Reed    const SkPMColor* lockColors(const SkBitmap& bm) {
803e762975133c7c9f529b996b3b1fee8b8910dc650Mike Reed        return this->lockColors(bm.getColorTable());
804e762975133c7c9f529b996b3b1fee8b8910dc650Mike Reed    }
805e762975133c7c9f529b996b3b1fee8b8910dc650Mike Reed
8060910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectprivate:
8070910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkColorTable*    fCTable;
8080910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    const SkPMColor* fColors;
8090910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project};
8100910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
8110910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project///////////////////////////////////////////////////////////////////////////////
8120910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
8130910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectinline uint32_t* SkBitmap::getAddr32(int x, int y) const {
8140910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkASSERT(fPixels);
8150910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkASSERT(fConfig == kARGB_8888_Config);
8160910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkASSERT((unsigned)x < fWidth && (unsigned)y < fHeight);
8170910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    return (uint32_t*)((char*)fPixels + y * fRowBytes + (x << 2));
8180910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
8190910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
8200910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectinline uint16_t* SkBitmap::getAddr16(int x, int y) const {
8210910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkASSERT(fPixels);
8220910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkASSERT(fConfig == kRGB_565_Config || fConfig == kARGB_4444_Config);
8230910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkASSERT((unsigned)x < fWidth && (unsigned)y < fHeight);
8240910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    return (uint16_t*)((char*)fPixels + y * fRowBytes + (x << 1));
8250910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
8260910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
8270910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectinline uint8_t* SkBitmap::getAddr8(int x, int y) const {
8280910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkASSERT(fPixels);
8290910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkASSERT(fConfig == kA8_Config || fConfig == kIndex8_Config);
8300910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkASSERT((unsigned)x < fWidth && (unsigned)y < fHeight);
8310910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    return (uint8_t*)fPixels + y * fRowBytes + x;
8320910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
8330910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
8340910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectinline SkPMColor SkBitmap::getIndex8Color(int x, int y) const {
8350910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkASSERT(fPixels);
8360910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkASSERT(fConfig == kIndex8_Config);
8370910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkASSERT((unsigned)x < fWidth && (unsigned)y < fHeight);
8380910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkASSERT(fColorTable);
8390910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    return (*fColorTable)[*((const uint8_t*)fPixels + y * fRowBytes + x)];
8400910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
8410910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
8420910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project// returns the address of the byte that contains the x coordinate
8430910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectinline uint8_t* SkBitmap::getAddr1(int x, int y) const {
8440910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkASSERT(fPixels);
8450910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkASSERT(fConfig == kA1_Config);
8460910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkASSERT((unsigned)x < fWidth && (unsigned)y < fHeight);
8470910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    return (uint8_t*)fPixels + y * fRowBytes + (x >> 3);
8480910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
8490910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
8500910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#endif
851