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