blob: 1b33ccf95164d7434ec81a042f3ed5f2e68b1214 [file] [log] [blame]
reed@android.com8a1c16f2008-12-17 15:59:43 +00001/*
epoger@google.comec3ed6a2011-07-28 14:26:00 +00002 * Copyright 2006 The Android Open Source Project
reed@android.com8a1c16f2008-12-17 15:59:43 +00003 *
epoger@google.comec3ed6a2011-07-28 14:26:00 +00004 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
reed@android.com8a1c16f2008-12-17 15:59:43 +00006 */
7
8#ifndef SkShader_DEFINED
9#define SkShader_DEFINED
10
11#include "SkBitmap.h"
12#include "SkFlattenable.h"
13#include "SkMask.h"
14#include "SkMatrix.h"
15#include "SkPaint.h"
bsalomon4beef912014-07-28 13:43:02 -070016#include "../gpu/GrColor.h"
reed@android.com8a1c16f2008-12-17 15:59:43 +000017
18class SkPath;
commit-bot@chromium.orgc5d9bb02014-04-08 15:19:34 +000019class SkPicture;
commit-bot@chromium.org79590552014-05-13 18:14:45 +000020class SkXfermode;
rileya@google.com03c1c352012-07-20 20:02:43 +000021class GrContext;
joshualittb0a8a372014-09-23 09:50:21 -070022class GrFragmentProcessor;
joshualitt9cc17752015-07-09 06:28:14 -070023class GrProcessorDataManager;
reed@android.com8a1c16f2008-12-17 15:59:43 +000024
25/** \class SkShader
reed@google.comad917992011-04-11 19:01:12 +000026 *
reed@google.com880dc472012-05-11 14:47:03 +000027 * Shaders specify the source color(s) for what is being drawn. If a paint
28 * has no shader, then the paint's color is used. If the paint has a
29 * shader, then the shader's color(s) are use instead, but they are
30 * modulated by the paint's alpha. This makes it easy to create a shader
31 * once (e.g. bitmap tiling or gradient) and then change its transparency
32 * w/o having to modify the original shader... only the paint's alpha needs
33 * to be modified.
reed@google.comad917992011-04-11 19:01:12 +000034 */
ctguil@chromium.org7ffb1b22011-03-15 21:27:08 +000035class SK_API SkShader : public SkFlattenable {
reed@android.com8a1c16f2008-12-17 15:59:43 +000036public:
commit-bot@chromium.org9c9005a2014-04-28 14:55:39 +000037 SkShader(const SkMatrix* localMatrix = NULL);
reed@android.com8a1c16f2008-12-17 15:59:43 +000038 virtual ~SkShader();
39
reed@google.comad917992011-04-11 19:01:12 +000040 /**
commit-bot@chromium.orgd12de022014-05-09 15:42:07 +000041 * Returns the local matrix.
scroggoc870d492014-07-11 10:42:12 -070042 *
43 * FIXME: This can be incorrect for a Shader with its own local matrix
44 * that is also wrapped via CreateLocalMatrixShader.
commit-bot@chromium.orgd12de022014-05-09 15:42:07 +000045 */
46 const SkMatrix& getLocalMatrix() const { return fLocalMatrix; }
47
reed@android.com8a1c16f2008-12-17 15:59:43 +000048 enum TileMode {
reed@google.com0beaba52012-03-16 14:38:06 +000049 /** replicate the edge color if the shader draws outside of its
50 * original bounds
51 */
52 kClamp_TileMode,
53
54 /** repeat the shader's image horizontally and vertically */
55 kRepeat_TileMode,
56
57 /** repeat the shader's image horizontally and vertically, alternating
58 * mirror images so that adjacent images always seam
59 */
60 kMirror_TileMode,
61
62#if 0
63 /** only draw within the original domain, return 0 everywhere else */
64 kDecal_TileMode,
65#endif
reed19c25f12015-03-15 14:01:21 -070066 };
reed@android.com8a1c16f2008-12-17 15:59:43 +000067
reed19c25f12015-03-15 14:01:21 -070068 enum {
69 kTileModeCount = kMirror_TileMode + 1
reed@android.com8a1c16f2008-12-17 15:59:43 +000070 };
71
72 // override these in your subclass
73
74 enum Flags {
75 //!< set if all of the colors will be opaque
reed@android.com3c9b2a42009-08-27 19:28:37 +000076 kOpaqueAlpha_Flag = 0x01,
reed@android.com5119bdb2009-06-12 21:27:03 +000077
reed@android.com8a1c16f2008-12-17 15:59:43 +000078 //! set if this shader's shadeSpan16() method can be called
reed@android.com3c9b2a42009-08-27 19:28:37 +000079 kHasSpan16_Flag = 0x02,
reed@android.com5119bdb2009-06-12 21:27:03 +000080
reed@android.com8a1c16f2008-12-17 15:59:43 +000081 /** Set this bit if the shader's native data type is instrinsically 16
82 bit, meaning that calling the 32bit shadeSpan() entry point will
83 mean the the impl has to up-sample 16bit data into 32bit. Used as a
84 a means of clearing a dither request if the it will have no effect
85 */
reed@android.com5119bdb2009-06-12 21:27:03 +000086 kIntrinsicly16_Flag = 0x04,
87
commit-bot@chromium.org87fcd952014-04-23 19:10:51 +000088 /** set if the spans only vary in X (const in Y).
reed@android.com5119bdb2009-06-12 21:27:03 +000089 e.g. an Nx1 bitmap that is being tiled in Y, or a linear-gradient
reed@android.com3c9b2a42009-08-27 19:28:37 +000090 that varies from left-to-right. This flag specifies this for
91 shadeSpan().
reed@android.com5119bdb2009-06-12 21:27:03 +000092 */
reed@android.com3c9b2a42009-08-27 19:28:37 +000093 kConstInY32_Flag = 0x08,
reed@google.com7c2f27d2011-03-07 19:29:00 +000094
reed@android.com3c9b2a42009-08-27 19:28:37 +000095 /** same as kConstInY32_Flag, but is set if this is true for shadeSpan16
96 which may not always be the case, since shadeSpan16 may be
97 predithered, which would mean it was not const in Y, even though
98 the 32bit shadeSpan() would be const.
99 */
100 kConstInY16_Flag = 0x10
reed@android.com8a1c16f2008-12-17 15:59:43 +0000101 };
102
reed@google.comad917992011-04-11 19:01:12 +0000103 /**
junov@chromium.orgb6e16192011-12-09 15:48:03 +0000104 * Returns true if the shader is guaranteed to produce only opaque
105 * colors, subject to the SkPaint using the shader to apply an opaque
106 * alpha value. Subclasses should override this to allow some
commit-bot@chromium.org87fcd952014-04-23 19:10:51 +0000107 * optimizations.
junov@chromium.orgb6e16192011-12-09 15:48:03 +0000108 */
109 virtual bool isOpaque() const { return false; }
110
commit-bot@chromium.orge901b6d2014-05-01 19:31:31 +0000111 /**
112 * ContextRec acts as a parameter bundle for creating Contexts.
113 */
114 struct ContextRec {
reed56263c72015-06-05 11:31:26 -0700115 ContextRec(const SkPaint& paint, const SkMatrix& matrix, const SkMatrix* localM)
116 : fPaint(&paint)
commit-bot@chromium.org80116dc2014-05-06 17:16:03 +0000117 , fMatrix(&matrix)
reed56263c72015-06-05 11:31:26 -0700118 , fLocalMatrix(localM) {}
commit-bot@chromium.orge901b6d2014-05-01 19:31:31 +0000119
commit-bot@chromium.org80116dc2014-05-06 17:16:03 +0000120 const SkPaint* fPaint; // the current paint associated with the draw
121 const SkMatrix* fMatrix; // the current matrix in the canvas
122 const SkMatrix* fLocalMatrix; // optional local matrix
commit-bot@chromium.orge901b6d2014-05-01 19:31:31 +0000123 };
124
commit-bot@chromium.org87fcd952014-04-23 19:10:51 +0000125 class Context : public ::SkNoncopyable {
126 public:
commit-bot@chromium.orge901b6d2014-05-01 19:31:31 +0000127 Context(const SkShader& shader, const ContextRec&);
commit-bot@chromium.org87fcd952014-04-23 19:10:51 +0000128
129 virtual ~Context();
130
131 /**
132 * Called sometimes before drawing with this shader. Return the type of
133 * alpha your shader will return. The default implementation returns 0.
134 * Your subclass should override if it can (even sometimes) report a
135 * non-zero value, since that will enable various blitters to perform
136 * faster.
137 */
138 virtual uint32_t getFlags() const { return 0; }
139
140 /**
141 * Return the alpha associated with the data returned by shadeSpan16(). If
142 * kHasSpan16_Flag is not set, this value is meaningless.
143 */
144 virtual uint8_t getSpan16Alpha() const { return fPaintAlpha; }
145
146 /**
147 * Called for each span of the object being drawn. Your subclass should
148 * set the appropriate colors (with premultiplied alpha) that correspond
149 * to the specified device coordinates.
150 */
151 virtual void shadeSpan(int x, int y, SkPMColor[], int count) = 0;
152
153 typedef void (*ShadeProc)(void* ctx, int x, int y, SkPMColor[], int count);
154 virtual ShadeProc asAShadeProc(void** ctx);
155
156 /**
157 * Called only for 16bit devices when getFlags() returns
158 * kOpaqueAlphaFlag | kHasSpan16_Flag
159 */
160 virtual void shadeSpan16(int x, int y, uint16_t[], int count);
161
162 /**
163 * Similar to shadeSpan, but only returns the alpha-channel for a span.
164 * The default implementation calls shadeSpan() and then extracts the alpha
165 * values from the returned colors.
166 */
167 virtual void shadeSpanAlpha(int x, int y, uint8_t alpha[], int count);
168
169 /**
170 * Helper function that returns true if this shader's shadeSpan16() method
171 * can be called.
172 */
173 bool canCallShadeSpan16() {
174 return SkShader::CanCallShadeSpan16(this->getFlags());
175 }
176
reedcc0e3112014-09-10 10:20:24 -0700177 // Notification from blitter::blitMask in case we need to see the non-alpha channels
178 virtual void set3DMask(const SkMask*) {}
179
commit-bot@chromium.org87fcd952014-04-23 19:10:51 +0000180 protected:
181 // Reference to shader, so we don't have to dupe information.
182 const SkShader& fShader;
183
184 enum MatrixClass {
185 kLinear_MatrixClass, // no perspective
186 kFixedStepInX_MatrixClass, // fast perspective, need to call fixedStepInX() each
187 // scanline
188 kPerspective_MatrixClass // slow perspective, need to mappoints each pixel
189 };
190 static MatrixClass ComputeMatrixClass(const SkMatrix&);
191
commit-bot@chromium.org80116dc2014-05-06 17:16:03 +0000192 uint8_t getPaintAlpha() const { return fPaintAlpha; }
193 const SkMatrix& getTotalInverse() const { return fTotalInverse; }
194 MatrixClass getInverseClass() const { return (MatrixClass)fTotalInverseClass; }
195 const SkMatrix& getCTM() const { return fCTM; }
commit-bot@chromium.org87fcd952014-04-23 19:10:51 +0000196 private:
commit-bot@chromium.org80116dc2014-05-06 17:16:03 +0000197 SkMatrix fCTM;
198 SkMatrix fTotalInverse;
199 uint8_t fPaintAlpha;
200 uint8_t fTotalInverseClass;
commit-bot@chromium.org87fcd952014-04-23 19:10:51 +0000201
202 typedef SkNoncopyable INHERITED;
203 };
reed@google.com7c2f27d2011-03-07 19:29:00 +0000204
reed@google.comad917992011-04-11 19:01:12 +0000205 /**
commit-bot@chromium.org87fcd952014-04-23 19:10:51 +0000206 * Create the actual object that does the shading.
commit-bot@chromium.org87fcd952014-04-23 19:10:51 +0000207 * Size of storage must be >= contextSize.
reed@google.coma641f3f2012-12-13 22:16:30 +0000208 */
commit-bot@chromium.orgce56d962014-05-05 18:39:18 +0000209 Context* createContext(const ContextRec&, void* storage) const;
reed@google.coma641f3f2012-12-13 22:16:30 +0000210
211 /**
commit-bot@chromium.org87fcd952014-04-23 19:10:51 +0000212 * Return the size of a Context returned by createContext.
commit-bot@chromium.orgf3e50592014-04-30 23:29:02 +0000213 *
214 * Override this if your subclass overrides createContext, to return the correct size of
215 * your subclass' context.
reed@google.comad917992011-04-11 19:01:12 +0000216 */
commit-bot@chromium.orgf3e50592014-04-30 23:29:02 +0000217 virtual size_t contextSize() const;
reed@android.com8a1c16f2008-12-17 15:59:43 +0000218
reed@google.comad917992011-04-11 19:01:12 +0000219 /**
220 * Helper to check the flags to know if it is legal to call shadeSpan16()
221 */
reed@android.com8a1c16f2008-12-17 15:59:43 +0000222 static bool CanCallShadeSpan16(uint32_t flags) {
223 return (flags & kHasSpan16_Flag) != 0;
224 }
225
reed@google.comad917992011-04-11 19:01:12 +0000226 /**
reed0f0af232015-09-08 11:02:04 -0700227 * Returns true if this shader is just a bitmap, and if not null, returns the bitmap,
228 * localMatrix, and tilemodes. If this is not a bitmap, returns false and ignores the
229 * out-parameters.
reed@android.comf2b98d62010-12-20 18:26:13 +0000230 */
reed0f0af232015-09-08 11:02:04 -0700231 bool isABitmap(SkBitmap* outTexture, SkMatrix* outMatrix, TileMode xy[2]) const {
232 return this->onIsABitmap(outTexture, outMatrix, xy);
scroggoff390c92015-09-08 06:24:08 -0700233 }
reed0f0af232015-09-08 11:02:04 -0700234
reedf5822822015-08-19 11:46:38 -0700235 bool isABitmap() const {
236 return this->isABitmap(nullptr, nullptr, nullptr);
237 }
238
vandebo@chromium.orgd3ae7792011-02-24 00:21:06 +0000239 /**
240 * If the shader subclass can be represented as a gradient, asAGradient
241 * returns the matching GradientType enum (or kNone_GradientType if it
242 * cannot). Also, if info is not null, asAGradient populates info with
243 * the relevant (see below) parameters for the gradient. fColorCount
244 * is both an input and output parameter. On input, it indicates how
245 * many entries in fColors and fColorOffsets can be used, if they are
246 * non-NULL. After asAGradient has run, fColorCount indicates how
247 * many color-offset pairs there are in the gradient. If there is
248 * insufficient space to store all of the color-offset pairs, fColors
249 * and fColorOffsets will not be altered. fColorOffsets specifies
250 * where on the range of 0 to 1 to transition to the given color.
251 * The meaning of fPoint and fRadius is dependant on the type of gradient.
252 *
253 * None:
254 * info is ignored.
255 * Color:
256 * fColorOffsets[0] is meaningless.
257 * Linear:
258 * fPoint[0] and fPoint[1] are the end-points of the gradient
259 * Radial:
260 * fPoint[0] and fRadius[0] are the center and radius
reed71a6cbf2015-05-04 08:32:51 -0700261 * Conical:
vandebo@chromium.orgd3ae7792011-02-24 00:21:06 +0000262 * fPoint[0] and fRadius[0] are the center and radius of the 1st circle
263 * fPoint[1] and fRadius[1] are the center and radius of the 2nd circle
264 * Sweep:
265 * fPoint[0] is the center of the sweep.
266 */
267
268 enum GradientType {
269 kNone_GradientType,
270 kColor_GradientType,
271 kLinear_GradientType,
272 kRadial_GradientType,
vandebo@chromium.orgd3ae7792011-02-24 00:21:06 +0000273 kSweep_GradientType,
reed@google.com83226972012-06-07 20:26:47 +0000274 kConical_GradientType,
275 kLast_GradientType = kConical_GradientType
vandebo@chromium.orgd3ae7792011-02-24 00:21:06 +0000276 };
277
278 struct GradientInfo {
279 int fColorCount; //!< In-out parameter, specifies passed size
280 // of fColors/fColorOffsets on input, and
281 // actual number of colors/offsets on
282 // output.
283 SkColor* fColors; //!< The colors in the gradient.
284 SkScalar* fColorOffsets; //!< The unit offset for color transitions.
285 SkPoint fPoint[2]; //!< Type specific, see above.
286 SkScalar fRadius[2]; //!< Type specific, see above.
287 TileMode fTileMode; //!< The tile mode used.
reed@google.com3d3a8602013-05-24 14:58:44 +0000288 uint32_t fGradientFlags; //!< see SkGradientShader::Flags
vandebo@chromium.orgd3ae7792011-02-24 00:21:06 +0000289 };
290
291 virtual GradientType asAGradient(GradientInfo* info) const;
292
rileya@google.com03c1c352012-07-20 20:02:43 +0000293 /**
commit-bot@chromium.org79590552014-05-13 18:14:45 +0000294 * If the shader subclass is composed of two shaders, return true, and if rec is not NULL,
295 * fill it out with info about the shader.
commit-bot@chromium.org30558792014-05-14 14:28:34 +0000296 *
297 * These are bare pointers; the ownership and reference count are unchanged.
commit-bot@chromium.org79590552014-05-13 18:14:45 +0000298 */
299
300 struct ComposeRec {
301 const SkShader* fShaderA;
302 const SkShader* fShaderB;
303 const SkXfermode* fMode;
304 };
305
djsollenc87dd2c2014-11-14 11:11:46 -0800306 virtual bool asACompose(ComposeRec*) const { return false; }
commit-bot@chromium.org79590552014-05-13 18:14:45 +0000307
308
309 /**
bsalomonc21b09e2015-08-28 18:46:56 -0700310 * Returns a GrFragmentProcessor that implements the shader for the GPU backend. NULL is
311 * returned if there is no GPU implementation.
bsalomon83d081a2014-07-08 09:56:10 -0700312 *
bsalomonc21b09e2015-08-28 18:46:56 -0700313 * The GPU device does not call SkShader::createContext(), instead we pass the view matrix,
314 * local matrix, and filter quality directly.
bsalomon83d081a2014-07-08 09:56:10 -0700315 *
bsalomonc21b09e2015-08-28 18:46:56 -0700316 * The GrContext may be used by the to create textures that are required by the returned
317 * processor.
bsalomonf1b7a1d2015-09-28 06:26:28 -0700318 *
319 * The returned GrFragmentProcessor should expect an unpremultiplied input color and
320 * produce a premultiplied output.
rileya@google.com03c1c352012-07-20 20:02:43 +0000321 */
bsalomonc21b09e2015-08-28 18:46:56 -0700322 virtual const GrFragmentProcessor* asFragmentProcessor(GrContext*,
323 const SkMatrix& viewMatrix,
324 const SkMatrix* localMatrix,
325 SkFilterQuality,
326 GrProcessorDataManager*) const;
rileya@google.com03c1c352012-07-20 20:02:43 +0000327
reed8367b8c2014-08-22 08:30:20 -0700328 /**
329 * If the shader can represent its "average" luminance in a single color, return true and
330 * if color is not NULL, return that color. If it cannot, return false and ignore the color
331 * parameter.
332 *
333 * Note: if this returns true, the returned color will always be opaque, as only the RGB
334 * components are used to compute luminance.
335 */
336 bool asLuminanceColor(SkColor*) const;
337
commit-bot@chromium.org79590552014-05-13 18:14:45 +0000338#ifdef SK_BUILD_FOR_ANDROID_FRAMEWORK
339 /**
340 * If the shader is a custom shader which has data the caller might want, call this function
341 * to get that data.
342 */
scroggo01c412e2014-11-24 09:05:35 -0800343 virtual bool asACustomShader(void** /* customData */) const { return false; }
commit-bot@chromium.org79590552014-05-13 18:14:45 +0000344#endif
345
reed@android.com8a1c16f2008-12-17 15:59:43 +0000346 //////////////////////////////////////////////////////////////////////////
347 // Factory methods for stock shaders
348
commit-bot@chromium.orgce56d962014-05-05 18:39:18 +0000349 /**
350 * Call this to create a new "empty" shader, that will not draw anything.
351 */
352 static SkShader* CreateEmptyShader();
353
reed8367b8c2014-08-22 08:30:20 -0700354 /**
355 * Call this to create a new shader that just draws the specified color. This should always
356 * draw the same as a paint with this color (and no shader).
357 */
358 static SkShader* CreateColorShader(SkColor);
359
reed@android.com8a1c16f2008-12-17 15:59:43 +0000360 /** Call this to create a new shader that will draw with the specified bitmap.
reed@google.com99c114e2012-05-03 20:14:26 +0000361 *
362 * If the bitmap cannot be used (e.g. has no pixels, or its dimensions
363 * exceed implementation limits (currently at 64K - 1)) then SkEmptyShader
364 * may be returned.
365 *
commit-bot@chromium.org91246b92013-12-05 15:43:19 +0000366 * If the src is kA8_Config then that mask will be colorized using the color on
367 * the paint.
368 *
reed@google.com99c114e2012-05-03 20:14:26 +0000369 * @param src The bitmap to use inside the shader
370 * @param tmx The tiling mode to use when sampling the bitmap in the x-direction.
371 * @param tmy The tiling mode to use when sampling the bitmap in the y-direction.
372 * @return Returns a new shader object. Note: this function never returns null.
reed@android.com8a1c16f2008-12-17 15:59:43 +0000373 */
374 static SkShader* CreateBitmapShader(const SkBitmap& src,
commit-bot@chromium.org9c9005a2014-04-28 14:55:39 +0000375 TileMode tmx, TileMode tmy,
376 const SkMatrix* localMatrix = NULL);
reed@android.com8a1c16f2008-12-17 15:59:43 +0000377
halcanarya5f46e12015-09-08 07:12:25 -0700378 // NOTE: You can create an SkImage Shader with SkImage::newShader().
379
commit-bot@chromium.orgc5d9bb02014-04-08 15:19:34 +0000380 /** Call this to create a new shader that will draw with the specified picture.
381 *
382 * @param src The picture to use inside the shader (if not NULL, its ref count
commit-bot@chromium.org855e88e2014-04-21 19:33:12 +0000383 * is incremented). The SkPicture must not be changed after
384 * successfully creating a picture shader.
commit-bot@chromium.orgc5d9bb02014-04-08 15:19:34 +0000385 * @param tmx The tiling mode to use when sampling the bitmap in the x-direction.
386 * @param tmy The tiling mode to use when sampling the bitmap in the y-direction.
fmalitab5f78262014-08-06 13:07:15 -0700387 * @param tile The tile rectangle in picture coordinates: this represents the subset
388 * (or superset) of the picture used when building a tile. It is not
389 * affected by localMatrix and does not imply scaling (only translation
390 * and cropping). If null, the tile rect is considered equal to the picture
391 * bounds.
commit-bot@chromium.orgc5d9bb02014-04-08 15:19:34 +0000392 * @return Returns a new shader object. Note: this function never returns null.
393 */
fmalita2be0fd82014-12-08 09:04:05 -0800394 static SkShader* CreatePictureShader(const SkPicture* src,
fmalitab5f78262014-08-06 13:07:15 -0700395 TileMode tmx, TileMode tmy,
396 const SkMatrix* localMatrix,
397 const SkRect* tile);
commit-bot@chromium.orgc5d9bb02014-04-08 15:19:34 +0000398
commit-bot@chromium.org8fae2132014-05-07 22:26:37 +0000399 /**
400 * Return a shader that will apply the specified localMatrix to the proxy shader.
401 * The specified matrix will be applied before any matrix associated with the proxy.
402 *
403 * Note: ownership of the proxy is not transferred (though a ref is taken).
404 */
405 static SkShader* CreateLocalMatrixShader(SkShader* proxy, const SkMatrix& localMatrix);
406
407 /**
408 * If this shader can be represented by another shader + a localMatrix, return that shader
409 * and, if not NULL, the localMatrix. If not, return NULL and ignore the localMatrix parameter.
410 *
411 * Note: the returned shader (if not NULL) will have been ref'd, and it is the responsibility
412 * of the caller to balance that with unref() when they are done.
413 */
414 virtual SkShader* refAsALocalMatrixShader(SkMatrix* localMatrix) const;
415
robertphillips0a482f42015-01-26 07:00:04 -0800416 SK_TO_STRING_VIRT()
commit-bot@chromium.orgc0b7e102013-10-23 17:06:21 +0000417 SK_DEFINE_FLATTENABLE_TYPE(SkShader)
418
reed@android.com8a1c16f2008-12-17 15:59:43 +0000419protected:
mtklein36352bf2015-03-25 18:17:31 -0700420 void flatten(SkWriteBuffer&) const override;
commit-bot@chromium.org87fcd952014-04-23 19:10:51 +0000421
commit-bot@chromium.orgce56d962014-05-05 18:39:18 +0000422 bool computeTotalInverse(const ContextRec&, SkMatrix* totalInverse) const;
commit-bot@chromium.org87fcd952014-04-23 19:10:51 +0000423
commit-bot@chromium.orgce56d962014-05-05 18:39:18 +0000424 /**
425 * Your subclass must also override contextSize() if it overrides onCreateContext().
426 * Base class impl returns NULL.
427 */
428 virtual Context* onCreateContext(const ContextRec&, void* storage) const;
429
reed8367b8c2014-08-22 08:30:20 -0700430 virtual bool onAsLuminanceColor(SkColor*) const {
431 return false;
432 }
reed0f0af232015-09-08 11:02:04 -0700433
434 virtual bool onIsABitmap(SkBitmap*, SkMatrix*, TileMode[2]) const {
435 return false;
436 }
437
commit-bot@chromium.orgce56d962014-05-05 18:39:18 +0000438private:
scroggoef0fd612014-07-11 11:33:52 -0700439 // This is essentially const, but not officially so it can be modified in
440 // constructors.
commit-bot@chromium.orgce56d962014-05-05 18:39:18 +0000441 SkMatrix fLocalMatrix;
scroggoc870d492014-07-11 10:42:12 -0700442
443 // So the SkLocalMatrixShader can whack fLocalMatrix in its SkReadBuffer constructor.
444 friend class SkLocalMatrixShader;
reed7a4d8472015-09-15 13:33:58 -0700445 friend class SkBitmapProcShader; // for computeTotalInverse()
scroggoc870d492014-07-11 10:42:12 -0700446
reed@android.com8a1c16f2008-12-17 15:59:43 +0000447 typedef SkFlattenable INHERITED;
448};
449
450#endif