blob: c1e253fd4a3c646d76e3887e9999e9fd6534af14 [file] [log] [blame]
rileya@google.com1c6d64b2012-07-27 15:49:05 +00001/*
2 * Copyright 2012 Google Inc.
3 *
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
6 */
7
8#ifndef SkGradientShaderPriv_DEFINED
9#define SkGradientShaderPriv_DEFINED
10
11#include "SkGradientShader.h"
12#include "SkClampRange.h"
13#include "SkColorPriv.h"
commit-bot@chromium.org8b0e8ac2014-01-30 18:58:24 +000014#include "SkReadBuffer.h"
15#include "SkWriteBuffer.h"
rileya@google.com1c6d64b2012-07-27 15:49:05 +000016#include "SkMallocPixelRef.h"
17#include "SkUnitMapper.h"
18#include "SkUtils.h"
19#include "SkTemplates.h"
20#include "SkBitmapCache.h"
21#include "SkShader.h"
commit-bot@chromium.org87fcd952014-04-23 19:10:51 +000022#include "SkOnce.h"
rileya@google.com1c6d64b2012-07-27 15:49:05 +000023
humper@google.com05af1af2013-01-07 16:47:43 +000024static inline void sk_memset32_dither(uint32_t dst[], uint32_t v0, uint32_t v1,
rileya@google.com1c6d64b2012-07-27 15:49:05 +000025 int count) {
26 if (count > 0) {
27 if (v0 == v1) {
28 sk_memset32(dst, v0, count);
29 } else {
30 int pairs = count >> 1;
31 for (int i = 0; i < pairs; i++) {
32 *dst++ = v0;
33 *dst++ = v1;
34 }
35 if (count & 1) {
36 *dst = v0;
37 }
38 }
39 }
40}
41
42// Clamp
43
humper@google.com05af1af2013-01-07 16:47:43 +000044static inline SkFixed clamp_tileproc(SkFixed x) {
rileya@google.com1c6d64b2012-07-27 15:49:05 +000045 return SkClampMax(x, 0xFFFF);
46}
47
48// Repeat
49
humper@google.com05af1af2013-01-07 16:47:43 +000050static inline SkFixed repeat_tileproc(SkFixed x) {
rileya@google.com1c6d64b2012-07-27 15:49:05 +000051 return x & 0xFFFF;
52}
53
54// Mirror
55
56// Visual Studio 2010 (MSC_VER=1600) optimizes bit-shift code incorrectly.
57// See http://code.google.com/p/skia/issues/detail?id=472
58#if defined(_MSC_VER) && (_MSC_VER >= 1600)
59#pragma optimize("", off)
60#endif
61
62static inline SkFixed mirror_tileproc(SkFixed x) {
63 int s = x << 15 >> 31;
64 return (x ^ s) & 0xFFFF;
65}
66
67#if defined(_MSC_VER) && (_MSC_VER >= 1600)
68#pragma optimize("", on)
69#endif
70
71///////////////////////////////////////////////////////////////////////////////
72
73typedef SkFixed (*TileProc)(SkFixed);
74
75///////////////////////////////////////////////////////////////////////////////
76
77static const TileProc gTileProcs[] = {
78 clamp_tileproc,
79 repeat_tileproc,
80 mirror_tileproc
81};
82
83///////////////////////////////////////////////////////////////////////////////
84
85class SkGradientShaderBase : public SkShader {
86public:
reed@google.com437d6eb2013-05-23 19:03:05 +000087 struct Descriptor {
88 Descriptor() {
89 sk_bzero(this, sizeof(*this));
90 fTileMode = SkShader::kClamp_TileMode;
91 }
skia.committer@gmail.com3e2345a2013-05-24 07:01:26 +000092
reed@google.com437d6eb2013-05-23 19:03:05 +000093 const SkColor* fColors;
94 const SkScalar* fPos;
95 int fCount;
96 SkShader::TileMode fTileMode;
97 SkUnitMapper* fMapper;
commit-bot@chromium.org6c5aea22014-04-22 16:25:15 +000098 uint32_t fGradFlags;
reed@google.com437d6eb2013-05-23 19:03:05 +000099 };
100
101public:
commit-bot@chromium.org9c9005a2014-04-28 14:55:39 +0000102 SkGradientShaderBase(const Descriptor& desc, const SkMatrix* localMatrix);
rileya@google.com1c6d64b2012-07-27 15:49:05 +0000103 virtual ~SkGradientShaderBase();
104
commit-bot@chromium.org87fcd952014-04-23 19:10:51 +0000105 // The cache is initialized on-demand when getCache16/32 is called.
106 class GradientShaderCache : public SkRefCnt {
107 public:
108 GradientShaderCache(U8CPU alpha, const SkGradientShaderBase& shader);
109 ~GradientShaderCache();
110
111 const uint16_t* getCache16();
112 const SkPMColor* getCache32();
113
114 SkMallocPixelRef* getCache32PixelRef() const { return fCache32PixelRef; }
115
116 unsigned getAlpha() const { return fCacheAlpha; }
117
118 private:
119 // Working pointers. If either is NULL, we need to recompute the corresponding cache values.
120 uint16_t* fCache16;
121 SkPMColor* fCache32;
122
123 uint16_t* fCache16Storage; // Storage for fCache16, allocated on demand.
124 SkMallocPixelRef* fCache32PixelRef;
125 const unsigned fCacheAlpha; // The alpha value we used when we computed the cache.
126 // Larger than 8bits so we can store uninitialized
127 // value.
128
129 const SkGradientShaderBase& fShader;
130
131 // Make sure we only initialize the caches once.
132 bool fCache16Inited, fCache32Inited;
133 SkMutex fCache16Mutex, fCache32Mutex;
134
135 static void initCache16(GradientShaderCache* cache);
136 static void initCache32(GradientShaderCache* cache);
137
138 static void Build16bitCache(uint16_t[], SkColor c0, SkColor c1, int count);
139 static void Build32bitCache(SkPMColor[], SkColor c0, SkColor c1, int count,
140 U8CPU alpha, uint32_t gradFlags);
141 };
142
143 class GradientShaderBaseContext : public SkShader::Context {
144 public:
145 GradientShaderBaseContext(const SkGradientShaderBase& shader, const SkBitmap& device,
146 const SkPaint& paint, const SkMatrix& matrix);
147 ~GradientShaderBaseContext() {}
148
149 virtual uint32_t getFlags() const SK_OVERRIDE { return fFlags; }
150
151 protected:
152 SkMatrix fDstToIndex;
153 SkMatrix::MapXYProc fDstToIndexProc;
154 uint8_t fDstToIndexClass;
155 uint8_t fFlags;
156
157 SkAutoTUnref<GradientShaderCache> fCache;
158
159 private:
160 typedef SkShader::Context INHERITED;
161 };
162
rileya@google.com1c6d64b2012-07-27 15:49:05 +0000163 virtual bool isOpaque() const SK_OVERRIDE;
164
165 void getGradientTableBitmap(SkBitmap*) const;
166
167 enum {
168 /// Seems like enough for visual accuracy. TODO: if pos[] deserves
169 /// it, use a larger cache.
170 kCache16Bits = 8,
reed@google.com3c2102c2013-02-01 12:59:40 +0000171 kCache16Count = (1 << kCache16Bits),
rileya@google.com1c6d64b2012-07-27 15:49:05 +0000172 kCache16Shift = 16 - kCache16Bits,
173 kSqrt16Shift = 8 - kCache16Bits,
174
175 /// Seems like enough for visual accuracy. TODO: if pos[] deserves
176 /// it, use a larger cache.
177 kCache32Bits = 8,
reed@google.com60040292013-02-04 18:21:23 +0000178 kCache32Count = (1 << kCache32Bits),
rileya@google.com1c6d64b2012-07-27 15:49:05 +0000179 kCache32Shift = 16 - kCache32Bits,
180 kSqrt32Shift = 8 - kCache32Bits,
181
182 /// This value is used to *read* the dither cache; it may be 0
183 /// if dithering is disabled.
rileya@google.com1c6d64b2012-07-27 15:49:05 +0000184 kDitherStride32 = kCache32Count,
rileya@google.com1c6d64b2012-07-27 15:49:05 +0000185 kDitherStride16 = kCache16Count,
rileya@google.com1c6d64b2012-07-27 15:49:05 +0000186 };
187
commit-bot@chromium.org996402b2014-04-18 14:42:11 +0000188 enum GpuColorType {
189 kTwo_GpuColorType,
190 kThree_GpuColorType, // Symmetric three color
191 kTexture_GpuColorType
192 };
193
194 // Determines and returns the gradient is a two color gradient, symmetric three color gradient
195 // or other (texture gradient). If it is two or symmetric three color, the colors array will
196 // also be filled with the gradient colors
197 GpuColorType getGpuColorType(SkColor colors[3]) const;
198
commit-bot@chromium.org6c5aea22014-04-22 16:25:15 +0000199 uint32_t getGradFlags() const { return fGradFlags; }
commit-bot@chromium.org53783b02014-04-17 21:09:49 +0000200
rileya@google.com1c6d64b2012-07-27 15:49:05 +0000201protected:
commit-bot@chromium.org8b0e8ac2014-01-30 18:58:24 +0000202 SkGradientShaderBase(SkReadBuffer& );
203 virtual void flatten(SkWriteBuffer&) const SK_OVERRIDE;
commit-bot@chromium.org0f10f7b2014-03-13 18:02:17 +0000204 SK_TO_STRING_OVERRIDE()
rileya@google.com1c6d64b2012-07-27 15:49:05 +0000205
206 SkUnitMapper* fMapper;
207 SkMatrix fPtsToUnit; // set by subclass
rileya@google.com1c6d64b2012-07-27 15:49:05 +0000208 TileMode fTileMode;
209 TileProc fTileProc;
210 int fColorCount;
reed@google.com3d3a8602013-05-24 14:58:44 +0000211 uint8_t fGradFlags;
rileya@google.com1c6d64b2012-07-27 15:49:05 +0000212
213 struct Rec {
214 SkFixed fPos; // 0...1
215 uint32_t fScale; // (1 << 24) / range
216 };
217 Rec* fRecs;
218
commit-bot@chromium.org44d83c12014-04-21 13:10:25 +0000219 void commonAsAGradient(GradientInfo*, bool flipGrad = false) const;
skia.committer@gmail.comd3b28e82014-04-22 03:05:17 +0000220
commit-bot@chromium.org44d83c12014-04-21 13:10:25 +0000221 /*
222 * Takes in pointers to gradient color and Rec info as colorSrc and recSrc respectively.
223 * Count is the number of colors in the gradient
224 * It will then flip all the color and rec information and return in their respective Dst
225 * pointers. It is assumed that space has already been allocated for the Dst pointers.
226 * The rec src and dst are only assumed to be valid if count > 2
227 */
228 static void FlipGradientColors(SkColor* colorDst, Rec* recDst,
229 SkColor* colorSrc, Rec* recSrc,
230 int count);
231
232 // V23_COMPATIBILITY_CODE
233 // Used for 2-pt conical gradients since we sort start/end cirlces by radius
234 // Assumes space has already been allocated for fOrigColors
235 void flipGradientColors();
rileya@google.com1c6d64b2012-07-27 15:49:05 +0000236
237private:
238 enum {
239 kColorStorageCount = 4, // more than this many colors, and we'll use sk_malloc for the space
240
241 kStorageSize = kColorStorageCount * (sizeof(SkColor) + sizeof(Rec))
242 };
243 SkColor fStorage[(kStorageSize + 3) >> 2];
commit-bot@chromium.org87fcd952014-04-23 19:10:51 +0000244 SkColor* fOrigColors; // original colors, before modulation by paint in context.
rileya@google.com1c6d64b2012-07-27 15:49:05 +0000245 bool fColorsAreOpaque;
246
commit-bot@chromium.org87fcd952014-04-23 19:10:51 +0000247 GradientShaderCache* refCache(U8CPU alpha) const;
248 mutable SkMutex fCacheMutex;
249 mutable SkAutoTUnref<GradientShaderCache> fCache;
rileya@google.com1c6d64b2012-07-27 15:49:05 +0000250
rileya@google.com1c6d64b2012-07-27 15:49:05 +0000251 void initCommon();
252
253 typedef SkShader INHERITED;
254};
255
reed@google.com55853db2013-02-01 19:34:59 +0000256static inline int init_dither_toggle(int x, int y) {
reed@google.com60040292013-02-04 18:21:23 +0000257 x &= 1;
258 y = (y & 1) << 1;
259 return (x | y) * SkGradientShaderBase::kDitherStride32;
reed@google.com55853db2013-02-01 19:34:59 +0000260}
261
262static inline int next_dither_toggle(int toggle) {
263 return toggle ^ SkGradientShaderBase::kDitherStride32;
264}
265
266static inline int init_dither_toggle16(int x, int y) {
267 return ((x ^ y) & 1) * SkGradientShaderBase::kDitherStride16;
268}
269
270static inline int next_dither_toggle16(int toggle) {
271 return toggle ^ SkGradientShaderBase::kDitherStride16;
272}
273
rileya@google.com1c6d64b2012-07-27 15:49:05 +0000274///////////////////////////////////////////////////////////////////////////////
275
bsalomon@google.comcf8fb1f2012-08-02 14:03:32 +0000276#if SK_SUPPORT_GPU
277
bsalomon@google.com77af6802013-10-02 13:04:56 +0000278#include "GrCoordTransform.h"
bsalomon@google.comd698f772012-10-25 13:22:00 +0000279#include "gl/GrGLEffect.h"
bsalomon@google.comcf8fb1f2012-08-02 14:03:32 +0000280
bsalomon@google.com08283af2012-10-26 13:01:20 +0000281class GrEffectStage;
bsalomon@google.com396e61f2012-10-25 19:00:29 +0000282class GrBackendEffectFactory;
rileya@google.com1c6d64b2012-07-27 15:49:05 +0000283
284/*
bsalomon@google.comd8b5fac2012-11-01 17:02:46 +0000285 * The interpretation of the texture matrix depends on the sample mode. The
rileya@google.com1c6d64b2012-07-27 15:49:05 +0000286 * texture matrix is applied both when the texture coordinates are explicit
287 * and when vertex positions are used as texture coordinates. In the latter
rmistry@google.comfbfcd562012-08-23 18:09:54 +0000288 * case the texture matrix is applied to the pre-view-matrix position
rileya@google.com1c6d64b2012-07-27 15:49:05 +0000289 * values.
290 *
291 * Normal SampleMode
292 * The post-matrix texture coordinates are in normalize space with (0,0) at
293 * the top-left and (1,1) at the bottom right.
294 * RadialGradient
295 * The matrix specifies the radial gradient parameters.
296 * (0,0) in the post-matrix space is center of the radial gradient.
297 * Radial2Gradient
298 * Matrix transforms to space where first circle is centered at the
rmistry@google.comfbfcd562012-08-23 18:09:54 +0000299 * origin. The second circle will be centered (x, 0) where x may be
300 * 0 and is provided by setRadial2Params. The post-matrix space is
rileya@google.com1c6d64b2012-07-27 15:49:05 +0000301 * normalized such that 1 is the second radius - first radius.
302 * SweepGradient
303 * The angle from the origin of texture coordinates in post-matrix space
304 * determines the gradient value.
305 */
306
rileya@google.comb3e50f22012-08-20 17:43:08 +0000307 class GrTextureStripAtlas;
308
rileya@google.com1c6d64b2012-07-27 15:49:05 +0000309// Base class for Gr gradient effects
bsalomon@google.coma469c282012-10-24 18:28:34 +0000310class GrGradientEffect : public GrEffect {
rileya@google.com1c6d64b2012-07-27 15:49:05 +0000311public:
312
bsalomon@google.com1ce49fc2012-09-18 14:14:49 +0000313 GrGradientEffect(GrContext* ctx,
314 const SkGradientShaderBase& shader,
bsalomon@google.comd8b5fac2012-11-01 17:02:46 +0000315 const SkMatrix& matrix,
bsalomon@google.com1ce49fc2012-09-18 14:14:49 +0000316 SkShader::TileMode tileMode);
rileya@google.com1c6d64b2012-07-27 15:49:05 +0000317
318 virtual ~GrGradientEffect();
319
rileya@google.comb3e50f22012-08-20 17:43:08 +0000320 bool useAtlas() const { return SkToBool(-1 != fRow); }
bsalomon@google.com81712882012-11-01 17:12:34 +0000321 SkScalar getYCoord() const { return fYCoord; };
rileya@google.comb3e50f22012-08-20 17:43:08 +0000322
bsalomon@google.com68b58c92013-01-17 16:50:08 +0000323 virtual void getConstantColorComponents(GrColor* color, uint32_t* validFlags) const SK_OVERRIDE;
skia.committer@gmail.com9a070f22013-09-10 07:01:44 +0000324
commit-bot@chromium.org996402b2014-04-18 14:42:11 +0000325 SkGradientShaderBase::GpuColorType getColorType() const { return fColorType; }
bsalomon@google.com82d12232013-09-09 15:36:26 +0000326
327 enum PremulType {
328 kBeforeInterp_PremulType,
329 kAfterInterp_PremulType,
330 };
331
332 PremulType getPremulType() const { return fPremulType; }
333
334 const SkColor* getColors(int pos) const {
commit-bot@chromium.org996402b2014-04-18 14:42:11 +0000335 SkASSERT(fColorType != SkGradientShaderBase::kTexture_GpuColorType);
bsalomon@google.com82d12232013-09-09 15:36:26 +0000336 SkASSERT((pos-1) <= fColorType);
337 return &fColors[pos];
338 }
bsalomon@google.com371e1052013-01-11 21:08:55 +0000339
bsalomon@google.comd4726202012-08-03 14:34:46 +0000340protected:
rileya@google.com1c6d64b2012-07-27 15:49:05 +0000341
bsalomon@google.comd4726202012-08-03 14:34:46 +0000342 /** Populates a pair of arrays with colors and stop info to construct a random gradient.
343 The function decides whether stop values should be used or not. The return value indicates
344 the number of colors, which will be capped by kMaxRandomGradientColors. colors should be
345 sized to be at least kMaxRandomGradientColors. stops is a pointer to an array of at least
346 size kMaxRandomGradientColors. It may be updated to NULL, indicating that NULL should be
347 passed to the gradient factory rather than the array.
348 */
349 static const int kMaxRandomGradientColors = 4;
commit-bot@chromium.orge0e7cfe2013-09-09 20:09:12 +0000350 static int RandomGradientParams(SkRandom* r,
bsalomon@google.comd4726202012-08-03 14:34:46 +0000351 SkColor colors[kMaxRandomGradientColors],
352 SkScalar** stops,
353 SkShader::TileMode* tm);
354
bsalomon@google.com8a252f72013-01-22 20:35:13 +0000355 virtual bool onIsEqual(const GrEffect& effect) const SK_OVERRIDE;
bsalomon@google.com68b58c92013-01-17 16:50:08 +0000356
commit-bot@chromium.org5fd7d5c2013-10-04 01:20:09 +0000357 const GrCoordTransform& getCoordTransform() const { return fCoordTransform; }
358
bsalomon@google.comd4726202012-08-03 14:34:46 +0000359private:
bsalomon@google.com77af6802013-10-02 13:04:56 +0000360 static const GrCoordSet kCoordSet = kLocal_GrCoordSet;
bsalomon@google.com68b58c92013-01-17 16:50:08 +0000361
bsalomon@google.com77af6802013-10-02 13:04:56 +0000362 GrCoordTransform fCoordTransform;
bsalomon@google.com6d003d12012-09-11 15:45:20 +0000363 GrTextureAccess fTextureAccess;
bsalomon@google.com81712882012-11-01 17:12:34 +0000364 SkScalar fYCoord;
rileya@google.comb3e50f22012-08-20 17:43:08 +0000365 GrTextureStripAtlas* fAtlas;
366 int fRow;
bsalomon@google.com371e1052013-01-11 21:08:55 +0000367 bool fIsOpaque;
commit-bot@chromium.org996402b2014-04-18 14:42:11 +0000368 SkGradientShaderBase::GpuColorType fColorType;
369 SkColor fColors[3]; // More than 3 colors we use texture
bsalomon@google.com82d12232013-09-09 15:36:26 +0000370 PremulType fPremulType; // This only changes behavior for two and three color special cases.
371 // It is already baked into to the table for texture gradients.
bsalomon@google.coma469c282012-10-24 18:28:34 +0000372 typedef GrEffect INHERITED;
rileya@google.com1c6d64b2012-07-27 15:49:05 +0000373
374};
375
376///////////////////////////////////////////////////////////////////////////////
377
bsalomon@google.com8ea78d82012-10-24 20:11:30 +0000378// Base class for GL gradient effects
bsalomon@google.comf78df332012-10-29 12:43:38 +0000379class GrGLGradientEffect : public GrGLEffect {
rileya@google.com1c6d64b2012-07-27 15:49:05 +0000380public:
bsalomon@google.com0707c292012-10-25 21:45:42 +0000381 GrGLGradientEffect(const GrBackendEffectFactory& factory);
382 virtual ~GrGLGradientEffect();
rileya@google.com1c6d64b2012-07-27 15:49:05 +0000383
bsalomon@google.comc7818882013-03-20 19:19:53 +0000384 virtual void setData(const GrGLUniformManager&, const GrDrawEffect&) SK_OVERRIDE;
rileya@google.comb3e50f22012-08-20 17:43:08 +0000385
bsalomon@google.comf78df332012-10-29 12:43:38 +0000386protected:
bsalomon@google.comd8b5fac2012-11-01 17:02:46 +0000387 enum {
bsalomon@google.com82d12232013-09-09 15:36:26 +0000388 kPremulTypeKeyBitCnt = 1,
bsalomon@google.com77af6802013-10-02 13:04:56 +0000389 kPremulTypeMask = 1,
bsalomon@google.com82d12232013-09-09 15:36:26 +0000390 kPremulBeforeInterpKey = kPremulTypeMask,
391
bsalomon@google.com77af6802013-10-02 13:04:56 +0000392 kTwoColorKey = 2 << kPremulTypeKeyBitCnt,
393 kThreeColorKey = 3 << kPremulTypeKeyBitCnt,
bsalomon@google.com82d12232013-09-09 15:36:26 +0000394 kColorKeyMask = kTwoColorKey | kThreeColorKey,
395 kColorKeyBitCnt = 2,
396
397 // Subclasses must shift any key bits they produce up by this amount
398 // and combine with the result of GenBaseGradientKey.
bsalomon@google.com77af6802013-10-02 13:04:56 +0000399 kBaseKeyBitCnt = (kPremulTypeKeyBitCnt + kColorKeyBitCnt)
bsalomon@google.comd8b5fac2012-11-01 17:02:46 +0000400 };
401
commit-bot@chromium.org996402b2014-04-18 14:42:11 +0000402 static SkGradientShaderBase::GpuColorType ColorTypeFromKey(EffectKey key){
bsalomon@google.com82d12232013-09-09 15:36:26 +0000403 if (kTwoColorKey == (key & kColorKeyMask)) {
commit-bot@chromium.org996402b2014-04-18 14:42:11 +0000404 return SkGradientShaderBase::kTwo_GpuColorType;
bsalomon@google.com82d12232013-09-09 15:36:26 +0000405 } else if (kThreeColorKey == (key & kColorKeyMask)) {
commit-bot@chromium.org996402b2014-04-18 14:42:11 +0000406 return SkGradientShaderBase::kThree_GpuColorType;
407 } else {return SkGradientShaderBase::kTexture_GpuColorType;}
bsalomon@google.com82d12232013-09-09 15:36:26 +0000408 }
409
410 static GrGradientEffect::PremulType PremulTypeFromKey(EffectKey key){
411 if (kPremulBeforeInterpKey == (key & kPremulTypeMask)) {
412 return GrGradientEffect::kBeforeInterp_PremulType;
413 } else {
414 return GrGradientEffect::kAfterInterp_PremulType;
415 }
416 }
417
bsalomon@google.comd8b5fac2012-11-01 17:02:46 +0000418 /**
bsalomon@google.com82d12232013-09-09 15:36:26 +0000419 * Subclasses must call this. It will return a value restricted to the lower kBaseKeyBitCnt
bsalomon@google.comd8b5fac2012-11-01 17:02:46 +0000420 * bits.
421 */
bsalomon@google.com82d12232013-09-09 15:36:26 +0000422 static EffectKey GenBaseGradientKey(const GrDrawEffect&);
bsalomon@google.comd8b5fac2012-11-01 17:02:46 +0000423
bsalomon@google.comf78df332012-10-29 12:43:38 +0000424 // Emits the uniform used as the y-coord to texture samples in derived classes. Subclasses
425 // should call this method from their emitCode().
bsalomon@google.com82d12232013-09-09 15:36:26 +0000426 void emitUniforms(GrGLShaderBuilder* builder, EffectKey key);
bsalomon@google.comf78df332012-10-29 12:43:38 +0000427
bsalomon@google.com82d12232013-09-09 15:36:26 +0000428
429 // emit code that gets a fragment's color from an expression for t; Has branches for 3 separate
430 // control flows inside -- 2 color gradients, 3 color symmetric gradients (both using
431 // native GLSL mix), and 4+ color gradients that use the traditional texture lookup.
432 void emitColor(GrGLShaderBuilder* builder,
433 const char* gradientTValue,
434 EffectKey key,
435 const char* outputColor,
436 const char* inputColor,
commit-bot@chromium.org3390b9a2013-10-03 15:17:58 +0000437 const TextureSamplerArray& samplers);
rileya@google.com1c6d64b2012-07-27 15:49:05 +0000438
439private:
bsalomon@google.com81712882012-11-01 17:12:34 +0000440 SkScalar fCachedYCoord;
rileya@google.comb3e50f22012-08-20 17:43:08 +0000441 GrGLUniformManager::UniformHandle fFSYUni;
bsalomon@google.com82d12232013-09-09 15:36:26 +0000442 GrGLUniformManager::UniformHandle fColorStartUni;
443 GrGLUniformManager::UniformHandle fColorMidUni;
444 GrGLUniformManager::UniformHandle fColorEndUni;
rileya@google.comb3e50f22012-08-20 17:43:08 +0000445
bsalomon@google.comf78df332012-10-29 12:43:38 +0000446 typedef GrGLEffect INHERITED;
rileya@google.com1c6d64b2012-07-27 15:49:05 +0000447};
448
449#endif
450
bsalomon@google.comcf8fb1f2012-08-02 14:03:32 +0000451#endif