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 SkShader_DEFINED 110910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define SkShader_DEFINED 120910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 130910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkBitmap.h" 140910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkFlattenable.h" 150910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkMask.h" 160910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkMatrix.h" 170910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkPaint.h" 180910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 190910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectclass SkPath; 200910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 210910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project/** \class SkShader 2287b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger * 2387b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger * SkShader is the based class for objects that return horizontal spans of 2487b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger * colors during drawing. A subclass of SkShader is installed in a SkPaint 2587b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger * calling paint.setShader(shader). After that any object (other than a bitmap) 2687b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger * that is drawn with that paint will get its color(s) from the shader. 2787b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger */ 28137a4ca42423bbb6d683067ea544c9a48f18f06cDerek Sollenbergerclass SK_API SkShader : public SkFlattenable { 290910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectpublic: 300910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkShader(); 310910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project virtual ~SkShader(); 320910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 3387b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger /** 3487b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger * Return true if the shader has a non-identity local matrix. 3587b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger * @param localM Optional: If not null, return the shader's local matrix 3687b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger * @return true if the shader has a non-identity local matrix. 3787b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger */ 380910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project bool getLocalMatrix(SkMatrix* localM) const; 3987b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger 4087b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger /** 4187b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger * Set the shader's local matrix. 4287b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger * @param localM The shader's new local matrix. 4387b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger */ 440910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project void setLocalMatrix(const SkMatrix& localM); 4587b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger 4687b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger /** 4787b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger * Reset the shader's local matrix to identity. 4887b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger */ 490910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project void resetLocalMatrix(); 500910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 510910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project enum TileMode { 520910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project kClamp_TileMode, //!< replicate the edge color if the shader draws outside of its original bounds 530910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project kRepeat_TileMode, //!< repeat the shader's image horizontally and vertically 540910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project kMirror_TileMode, //!< repeat the shader's image horizontally and vertically, alternating mirror images so that adjacent images always seam 550910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 560910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project kTileModeCount 570910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project }; 580910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 590910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project // override these in your subclass 600910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 610910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project enum Flags { 620910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project //!< set if all of the colors will be opaque 632e8fbf0f64801962778aa2d0e0177a8be4c03d89Mike Reed kOpaqueAlpha_Flag = 0x01, 64f294d10d594ac335ea3bd09caec89004d41edc5cMike Reed 650910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project //! set if this shader's shadeSpan16() method can be called 662e8fbf0f64801962778aa2d0e0177a8be4c03d89Mike Reed kHasSpan16_Flag = 0x02, 67f294d10d594ac335ea3bd09caec89004d41edc5cMike Reed 680910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project /** Set this bit if the shader's native data type is instrinsically 16 690910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project bit, meaning that calling the 32bit shadeSpan() entry point will 700910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project mean the the impl has to up-sample 16bit data into 32bit. Used as a 710910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project a means of clearing a dither request if the it will have no effect 720910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project */ 73f294d10d594ac335ea3bd09caec89004d41edc5cMike Reed kIntrinsicly16_Flag = 0x04, 74f294d10d594ac335ea3bd09caec89004d41edc5cMike Reed 75f294d10d594ac335ea3bd09caec89004d41edc5cMike Reed /** set (after setContext) if the spans only vary in X (const in Y). 76f294d10d594ac335ea3bd09caec89004d41edc5cMike Reed e.g. an Nx1 bitmap that is being tiled in Y, or a linear-gradient 772e8fbf0f64801962778aa2d0e0177a8be4c03d89Mike Reed that varies from left-to-right. This flag specifies this for 782e8fbf0f64801962778aa2d0e0177a8be4c03d89Mike Reed shadeSpan(). 79f294d10d594ac335ea3bd09caec89004d41edc5cMike Reed */ 802e8fbf0f64801962778aa2d0e0177a8be4c03d89Mike Reed kConstInY32_Flag = 0x08, 8105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger 822e8fbf0f64801962778aa2d0e0177a8be4c03d89Mike Reed /** same as kConstInY32_Flag, but is set if this is true for shadeSpan16 832e8fbf0f64801962778aa2d0e0177a8be4c03d89Mike Reed which may not always be the case, since shadeSpan16 may be 842e8fbf0f64801962778aa2d0e0177a8be4c03d89Mike Reed predithered, which would mean it was not const in Y, even though 852e8fbf0f64801962778aa2d0e0177a8be4c03d89Mike Reed the 32bit shadeSpan() would be const. 862e8fbf0f64801962778aa2d0e0177a8be4c03d89Mike Reed */ 872e8fbf0f64801962778aa2d0e0177a8be4c03d89Mike Reed kConstInY16_Flag = 0x10 880910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project }; 890910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 9087b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger /** 9187b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger * Called sometimes before drawing with this shader. Return the type of 9287b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger * alpha your shader will return. The default implementation returns 0. 9387b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger * Your subclass should override if it can (even sometimes) report a 9487b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger * non-zero value, since that will enable various blitters to perform 9587b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger * faster. 9687b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger */ 970910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project virtual uint32_t getFlags() { return 0; } 980910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 9987b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger /** 1001cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * Returns true if the shader is guaranteed to produce only opaque 1011cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * colors, subject to the SkPaint using the shader to apply an opaque 1021cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * alpha value. Subclasses should override this to allow some 1031cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * optimizations. isOpaque() can be called at any time, unlike getFlags, 1041cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * which only works properly when the context is set. 1051cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger */ 1061cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger virtual bool isOpaque() const { return false; } 1071cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 1081cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger /** 10987b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger * Return the alpha associated with the data returned by shadeSpan16(). If 11087b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger * kHasSpan16_Flag is not set, this value is meaningless. 11187b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger */ 1120910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project virtual uint8_t getSpan16Alpha() const { return fPaintAlpha; } 11305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger 11487b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger /** 11587b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger * Called once before drawing, with the current paint and device matrix. 11687b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger * Return true if your shader supports these parameters, or false if not. 11787b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger * If false is returned, nothing will be drawn. 11887b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger */ 1192e8fbf0f64801962778aa2d0e0177a8be4c03d89Mike Reed virtual bool setContext(const SkBitmap& device, const SkPaint& paint, 1202e8fbf0f64801962778aa2d0e0177a8be4c03d89Mike Reed const SkMatrix& matrix); 1210910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 12287b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger /** 12387b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger * Called for each span of the object being drawn. Your subclass should 12487b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger * set the appropriate colors (with premultiplied alpha) that correspond 12587b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger * to the specified device coordinates. 12687b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger */ 1272e8fbf0f64801962778aa2d0e0177a8be4c03d89Mike Reed virtual void shadeSpan(int x, int y, SkPMColor[], int count) = 0; 12887b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger 12987b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger /** 13087b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger * Called only for 16bit devices when getFlags() returns 13187b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger * kOpaqueAlphaFlag | kHasSpan16_Flag 13287b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger */ 1332e8fbf0f64801962778aa2d0e0177a8be4c03d89Mike Reed virtual void shadeSpan16(int x, int y, uint16_t[], int count); 13487b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger 13587b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger /** 13687b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger * Similar to shadeSpan, but only returns the alpha-channel for a span. 13787b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger * The default implementation calls shadeSpan() and then extracts the alpha 13887b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger * values from the returned colors. 13987b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger */ 1402e8fbf0f64801962778aa2d0e0177a8be4c03d89Mike Reed virtual void shadeSpanAlpha(int x, int y, uint8_t alpha[], int count); 1410910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 14287b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger /** 14387b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger * Helper function that returns true if this shader's shadeSpan16() method 14487b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger * can be called. 14587b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger */ 1462e8fbf0f64801962778aa2d0e0177a8be4c03d89Mike Reed bool canCallShadeSpan16() { 1470910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return SkShader::CanCallShadeSpan16(this->getFlags()); 1480910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 1490910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 15087b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger /** 15187b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger * Helper to check the flags to know if it is legal to call shadeSpan16() 15287b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger */ 1530910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project static bool CanCallShadeSpan16(uint32_t flags) { 1540910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return (flags & kHasSpan16_Flag) != 0; 1550910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 1560910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 15787b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger /** 15887b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger * Called before a session using the shader begins. Some shaders override 15987b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger * this to defer some of their work (like calling bitmap.lockPixels()). 16087b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger * Must be balanced by a call to endSession. 16187b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger */ 1620910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project virtual void beginSession(); 1630910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project virtual void endSession(); 16405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger 16540528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger /** 16640528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger Gives method bitmap should be read to implement a shader. 16740528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger Also determines number and interpretation of "extra" parameters returned 16840528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger by asABitmap 16940528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger */ 17040528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger enum BitmapType { 17140528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger kNone_BitmapType, //<! Shader is not represented as a bitmap 17205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger kDefault_BitmapType,//<! Access bitmap using local coords transformed 17340528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger // by matrix. No extras 17405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger kRadial_BitmapType, //<! Access bitmap by transforming local coordinates 17505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger // by the matrix and taking the distance of result 17605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger // from (0,0) as bitmap column. Bitmap is 1 pixel 17740528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger // tall. No extras 17805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger kSweep_BitmapType, //<! Access bitmap by transforming local coordinates 17940528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger // by the matrix and taking the angle of result 18040528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger // to (0,0) as bitmap x coord, where angle = 0 is 18105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger // bitmap left edge of bitmap = 2pi is the 18240528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger // right edge. Bitmap is 1 pixel tall. No extras 18305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger kTwoPointRadial_BitmapType, 18405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger //<! Matrix transforms to space where (0,0) is 18540528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger // the center of the starting circle. The second 18605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger // circle will be centered (x, 0) where x may be 18705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger // 0. The post-matrix space is normalized such 18840528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger // that 1 is the second radius - first radius. 18940528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger // Three extra parameters are returned: 19005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger // 0: x-offset of second circle center 19140528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger // to first. 19205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger // 1: radius of first circle in post-matrix 19340528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger // space 19440528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger // 2: the second radius minus the first radius 19505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger // in pre-transformed space. 19605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger 19705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger kLast_BitmapType = kTwoPointRadial_BitmapType 19840528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger }; 1990910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project /** Optional methods for shaders that can pretend to be a bitmap/texture 20005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger to play along with opengl. Default just returns kNone_BitmapType and 20140528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger ignores the out parameters. 20240528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger 20340528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger @param outTexture if non-NULL will be the bitmap representing the shader 20440528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger after return. 20540528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger @param outMatrix if non-NULL will be the matrix to apply to vertices 20640528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger to access the bitmap after return. 20740528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger @param xy if non-NULL will be the tile modes that should be 20840528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger used to access the bitmap after return. 20940528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger @param twoPointRadialParams Two extra return values needed for two point 21040528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger radial bitmaps. The first is the x-offset of 21140528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger the second point and the second is the radius 21240528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger about the first point. 2130910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project */ 21440528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger virtual BitmapType asABitmap(SkBitmap* outTexture, SkMatrix* outMatrix, 21587b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger TileMode xy[2], SkScalar* twoPointRadialParams) const; 21605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger 21705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger /** 21805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger * If the shader subclass can be represented as a gradient, asAGradient 21905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger * returns the matching GradientType enum (or kNone_GradientType if it 22005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger * cannot). Also, if info is not null, asAGradient populates info with 22105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger * the relevant (see below) parameters for the gradient. fColorCount 22205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger * is both an input and output parameter. On input, it indicates how 22305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger * many entries in fColors and fColorOffsets can be used, if they are 22405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger * non-NULL. After asAGradient has run, fColorCount indicates how 22505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger * many color-offset pairs there are in the gradient. If there is 22605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger * insufficient space to store all of the color-offset pairs, fColors 22705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger * and fColorOffsets will not be altered. fColorOffsets specifies 22805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger * where on the range of 0 to 1 to transition to the given color. 22905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger * The meaning of fPoint and fRadius is dependant on the type of gradient. 23005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger * 23105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger * None: 23205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger * info is ignored. 23305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger * Color: 23405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger * fColorOffsets[0] is meaningless. 23505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger * Linear: 23605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger * fPoint[0] and fPoint[1] are the end-points of the gradient 23705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger * Radial: 23805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger * fPoint[0] and fRadius[0] are the center and radius 23905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger * Radial2: 24005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger * fPoint[0] and fRadius[0] are the center and radius of the 1st circle 24105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger * fPoint[1] and fRadius[1] are the center and radius of the 2nd circle 24205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger * Sweep: 24305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger * fPoint[0] is the center of the sweep. 24405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger */ 24505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger 24605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger enum GradientType { 24705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger kNone_GradientType, 24805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger kColor_GradientType, 24905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger kLinear_GradientType, 25005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger kRadial_GradientType, 25105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger kRadial2_GradientType, 25205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger kSweep_GradientType, 25305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger kLast_GradientType = kSweep_GradientType 25405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger }; 25505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger 25605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger struct GradientInfo { 25705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger int fColorCount; //!< In-out parameter, specifies passed size 25805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger // of fColors/fColorOffsets on input, and 25905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger // actual number of colors/offsets on 26005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger // output. 26105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger SkColor* fColors; //!< The colors in the gradient. 26205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger SkScalar* fColorOffsets; //!< The unit offset for color transitions. 26305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger SkPoint fPoint[2]; //!< Type specific, see above. 26405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger SkScalar fRadius[2]; //!< Type specific, see above. 26505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger TileMode fTileMode; //!< The tile mode used. 26605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger }; 26705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger 26805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger virtual GradientType asAGradient(GradientInfo* info) const; 2690910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 2700910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project ////////////////////////////////////////////////////////////////////////// 2710910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project // Factory methods for stock shaders 2720910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 2730910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project /** Call this to create a new shader that will draw with the specified bitmap. 2740910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project @param src The bitmap to use inside the shader 2750910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project @param tmx The tiling mode to use when sampling the bitmap in the x-direction. 2760910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project @param tmy The tiling mode to use when sampling the bitmap in the y-direction. 2770910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project @return Returns a new shader object. Note: this function never returns null. 2780910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project */ 2790910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project static SkShader* CreateBitmapShader(const SkBitmap& src, 2800910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project TileMode tmx, TileMode tmy); 2810910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 2821cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger virtual void flatten(SkFlattenableWriteBuffer& ) SK_OVERRIDE; 2830910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectprotected: 2840910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project enum MatrixClass { 2850910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project kLinear_MatrixClass, // no perspective 2860910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project kFixedStepInX_MatrixClass, // fast perspective, need to call fixedStepInX() each scanline 2870910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project kPerspective_MatrixClass // slow perspective, need to mappoints each pixel 2880910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project }; 2890910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project static MatrixClass ComputeMatrixClass(const SkMatrix&); 2900910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 2910910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project // These can be called by your subclass after setContext() has been called 2920910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project uint8_t getPaintAlpha() const { return fPaintAlpha; } 2930910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkBitmap::Config getDeviceConfig() const { return (SkBitmap::Config)fDeviceConfig; } 2940910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project const SkMatrix& getTotalInverse() const { return fTotalInverse; } 2950910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project MatrixClass getInverseClass() const { return (MatrixClass)fTotalInverseClass; } 2960910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 2970910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkShader(SkFlattenableReadBuffer& ); 2980910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectprivate: 2990910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkMatrix* fLocalMatrix; 3000910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkMatrix fTotalInverse; 3010910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project uint8_t fPaintAlpha; 3020910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project uint8_t fDeviceConfig; 3030910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project uint8_t fTotalInverseClass; 3040910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkDEBUGCODE(SkBool8 fInSession;) 3050910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 3060910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project static SkShader* CreateBitmapShader(const SkBitmap& src, 3070910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project TileMode, TileMode, 3080910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project void* storage, size_t storageSize); 3090910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project friend class SkAutoBitmapShaderInstall; 3100910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project typedef SkFlattenable INHERITED; 3110910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}; 3120910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 3130910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#endif 3140910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 315