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