1 /****************************************************************************
2 **
3 ** Copyright (C) 2015 The Qt Company Ltd.
4 ** Contact: http://www.qt.io/licensing/
5 **
6 ** This file is part of the QtOpenGL module of the Qt Toolkit.
7 **
8 ** $QT_BEGIN_LICENSE:LGPL$
9 ** Commercial License Usage
10 ** Licensees holding valid commercial Qt licenses may use this file in
11 ** accordance with the commercial license agreement provided with the
12 ** Software or, alternatively, in accordance with the terms contained in
13 ** a written agreement between you and The Qt Company. For licensing terms
14 ** and conditions see http://www.qt.io/terms-conditions. For further
15 ** information use the contact form at http://www.qt.io/contact-us.
16 **
17 ** GNU Lesser General Public License Usage
18 ** Alternatively, this file may be used under the terms of the GNU Lesser
19 ** General Public License version 2.1 or version 3 as published by the Free
20 ** Software Foundation and appearing in the file LICENSE.LGPLv21 and
21 ** LICENSE.LGPLv3 included in the packaging of this file. Please review the
22 ** following information to ensure the GNU Lesser General Public License
23 ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and
24 ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
25 **
26 ** As a special exception, The Qt Company gives you certain additional
27 ** rights. These rights are described in The Qt Company LGPL Exception
28 ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
29 **
30 ** GNU General Public License Usage
31 ** Alternatively, this file may be used under the terms of the GNU
32 ** General Public License version 3.0 as published by the Free Software
33 ** Foundation and appearing in the file LICENSE.GPL included in the
34 ** packaging of this file.  Please review the following information to
35 ** ensure the GNU General Public License version 3.0 requirements will be
36 ** met: http://www.gnu.org/copyleft/gpl.html.
37 **
38 ** $QT_END_LICENSE$
39 **
40 ****************************************************************************/
41 
42 #ifndef FRAGMENTPROGRAMS_P_H
43 #define FRAGMENTPROGRAMS_P_H
44 
45 //
46 //  W A R N I N G
47 //  -------------
48 //
49 // This file is not part of the Qt API.  It exists purely as an
50 // implementation detail.  This header file may change from version to
51 // version without notice, or even be removed.
52 //
53 // We mean it.
54 //
55 
56 enum FragmentVariable {
57     VAR_BRUSH_TEXTURE,
58     VAR_LINEAR,
59     VAR_INV_MATRIX_M1,
60     VAR_INV_MASK_SIZE,
61     VAR_INV_MATRIX_M2,
62     VAR_PORTERDUFF_AB,
63     VAR_MASK_CHANNEL,
64     VAR_ELLIPSE_OFFSET,
65     VAR_PORTERDUFF_XYZ,
66     VAR_INV_DST_SIZE,
67     VAR_MASK_TEXTURE,
68     VAR_DST_TEXTURE,
69     VAR_PALETTE,
70     VAR_MASK_OFFSET,
71     VAR_INV_BRUSH_TEXTURE_SIZE,
72     VAR_FMP2_M_RADIUS2,
73     VAR_FMP,
74     VAR_INV_MATRIX_M0,
75     VAR_ANGLE
76 };
77 
78 enum FragmentBrushType {
79     FRAGMENT_PROGRAM_BRUSH_SOLID,
80     FRAGMENT_PROGRAM_BRUSH_RADIAL,
81     FRAGMENT_PROGRAM_BRUSH_CONICAL,
82     FRAGMENT_PROGRAM_BRUSH_LINEAR,
83     FRAGMENT_PROGRAM_BRUSH_TEXTURE,
84     FRAGMENT_PROGRAM_BRUSH_PATTERN
85 };
86 
87 enum FragmentCompositionModeType {
88     COMPOSITION_MODES_SIMPLE_PORTER_DUFF,
89     COMPOSITION_MODES_MULTIPLY,
90     COMPOSITION_MODES_SCREEN,
91     COMPOSITION_MODES_OVERLAY,
92     COMPOSITION_MODES_DARKEN,
93     COMPOSITION_MODES_LIGHTEN,
94     COMPOSITION_MODES_COLORDODGE,
95     COMPOSITION_MODES_COLORBURN,
96     COMPOSITION_MODES_HARDLIGHT,
97     COMPOSITION_MODES_SOFTLIGHT,
98     COMPOSITION_MODES_DIFFERENCE,
99     COMPOSITION_MODES_EXCLUSION,
100     COMPOSITION_MODES_SIMPLE_PORTER_DUFF_NOMASK,
101     COMPOSITION_MODES_MULTIPLY_NOMASK,
102     COMPOSITION_MODES_SCREEN_NOMASK,
103     COMPOSITION_MODES_OVERLAY_NOMASK,
104     COMPOSITION_MODES_DARKEN_NOMASK,
105     COMPOSITION_MODES_LIGHTEN_NOMASK,
106     COMPOSITION_MODES_COLORDODGE_NOMASK,
107     COMPOSITION_MODES_COLORBURN_NOMASK,
108     COMPOSITION_MODES_HARDLIGHT_NOMASK,
109     COMPOSITION_MODES_SOFTLIGHT_NOMASK,
110     COMPOSITION_MODES_DIFFERENCE_NOMASK,
111     COMPOSITION_MODES_EXCLUSION_NOMASK,
112     COMPOSITION_MODE_BLEND_MODE_MASK,
113     COMPOSITION_MODE_BLEND_MODE_NOMASK
114 };
115 
116 enum FragmentMaskType {
117     FRAGMENT_PROGRAM_MASK_TRAPEZOID_AA,
118     FRAGMENT_PROGRAM_MASK_ELLIPSE_AA
119 };
120 
121 static const unsigned int num_fragment_variables = 19;
122 
123 static const unsigned int num_fragment_brushes = 6;
124 static const unsigned int num_fragment_composition_modes = 26;
125 static const unsigned int num_fragment_masks = 2;
126 
127 static const char *FragmentProgram_FRAGMENT_PROGRAM_MASK_TRAPEZOID_AA =
128     "!!ARBfp1.0\n"
129     "PARAM c[1] = { { 0.5, 2 } };\n"
130     "TEMP R0;\n"
131     "TEMP R1;\n"
132     "TEMP R2;\n"
133     "TEMP R3;\n"
134     "TEMP R4;\n"
135     "ADD R3.z, fragment.position.x, c[0].x;\n"
136     "ADD R0.y, fragment.position, -c[0].x;\n"
137     "MAX R4.x, fragment.texcoord[0].y, R0.y;\n"
138     "ADD R0.x, fragment.position.y, c[0];\n"
139     "MIN R3.w, R0.x, fragment.texcoord[0].x;\n"
140     "ADD R2.z, fragment.position.x, -c[0].x;\n"
141     "MOV R2.w, R3.z;\n"
142     "MOV R0.yw, R4.x;\n"
143     "MOV R0.xz, R3.w;\n"
144     "MAD R0, fragment.texcoord[1].xxzz, R0, fragment.texcoord[1].yyww;\n"
145     "MAD R0.zw, fragment.position.x, c[0].y, -R0;\n"
146     "MOV R2.x, R0;\n"
147     "MOV R2.y, R0.z;\n"
148     "MOV R1.w, R0;\n"
149     "MOV R1.z, R0.y;\n"
150     "MIN R1.xy, R2, R1.zwzw;\n"
151     "SGE R0.xy, R1.zwzw, R2;\n"
152     "ADD R0.zw, -fragment.texcoord[0], -fragment.texcoord[0];\n"
153     "MAD R3.xy, R0, R0.zwzw, fragment.texcoord[0].zwzw;\n"
154     "ADD R0, -R1.xxyy, R2.zwzw;\n"
155     "MAD R0, R0, R3.xxyy, R4.x;\n"
156     "ADD R3.xy, R0.ywzw, R0.xzzw;\n"
157     "ADD R4.zw, R3.w, -R0.xyxz;\n"
158     "ADD R0.zw, -R4.x, R0.xyyw;\n"
159     "ADD R0.xy, R3.z, -R1;\n"
160     "MAX R1.zw, R2.xyxy, R1;\n"
161     "MUL R0.xy, R0, R0.zwzw;\n"
162     "MAD R3.xy, -R3, c[0].x, R3.w;\n"
163     "ADD R2.w, R3.z, -R2.z;\n"
164     "MUL R2.xy, R3, R2.w;\n"
165     "ADD R2.w, R3, -R4.x;\n"
166     "ADD R3.xy, -R2.z, R1.zwzw;\n"
167     "MUL R3.xy, R4.zwzw, R3;\n"
168     "ADD R4.zw, R1.xyxy, R1;\n"
169     "MAD R0.zw, R4, c[0].x, -R2.z;\n"
170     "MAD R0.xy, -R0, c[0].x, R2.w;\n"
171     "MAD R4.zw, R0, R2.w, -R0.xyxy;\n"
172     "SGE R0.zw, R3.z, R1;\n"
173     "MAD R0.xy, R0.zwzw, R4.zwzw, R0;\n"
174     "MAD R3.xy, R3, c[0].x, -R2;\n"
175     "MAD R0.zw, R0, R3.xyxy, R2.xyxy;\n"
176     "ADD R2.xy, R0.zwzw, -R0;\n"
177     "SGE R0.zw, R2.z, R1.xyxy;\n"
178     "MAD R0.xy, R0.zwzw, R2, R0;\n"
179     "SGE R0.zw, R1, R2.z;\n"
180     "ADD R0.xy, R0, -R2.w;\n"
181     "SGE R1.xy, R3.z, R1;\n"
182     "MAD R0.xy, R1, R0, R2.w;\n"
183     "MAD R0.x, -R0, R0.z, R2.w;\n"
184     "SGE R0.z, R3.w, R4.x;\n"
185     "MAD R0.x, -R0.y, R0.w, R0;\n"
186     "MUL result.color, R0.x, R0.z;\n"
187     "END\n"
188     ;
189 
190 static const char *FragmentProgram_FRAGMENT_PROGRAM_MASK_ELLIPSE_AA =
191     "!!ARBfp1.0\n"
192     "PARAM c[6] = { program.local[0..3],\n"
193     "		{ -2, 1, -0.5, 2 },\n"
194     "		{ 3 } };\n"
195     "TEMP R0;\n"
196     "TEMP R1;\n"
197     "TEMP R2;\n"
198     "ADD R0.xy, fragment.position, c[3];\n"
199     "MUL R1.xyz, R0.y, c[1];\n"
200     "MAD R0.xyz, R0.x, c[0], R1;\n"
201     "ADD R0.xyz, R0, c[2];\n"
202     "RCP R2.z, R0.z;\n"
203     "MUL R0.zw, R0.xyxy, R2.z;\n"
204     "MUL R2.xy, R0.zwzw, fragment.texcoord[0];\n"
205     "MOV R1.xy, c[0];\n"
206     "MOV R1.zw, c[1].xyxy;\n"
207     "MOV R0.x, c[0].z;\n"
208     "MOV R0.y, c[1].z;\n"
209     "MAD R0, R0.zzww, -R0.xyxy, R1.xzyw;\n"
210     "MUL R1.xy, R2, fragment.texcoord[0];\n"
211     "MUL R0, R2.z, R0;\n"
212     "MUL R1.xy, R1, c[4].x;\n"
213     "MUL R1.zw, R1.xyxy, R0.xyxz;\n"
214     "MUL R0.zw, R1.xyxy, R0.xyyw;\n"
215     "ADD R0.y, R0.z, R0.w;\n"
216     "ADD R0.x, R1.z, R1.w;\n"
217     "MUL R0.xy, R0, R0;\n"
218     "ADD R0.x, R0, R0.y;\n"
219     "MUL R0.zw, R2.xyxy, R2.xyxy;\n"
220     "ADD R0.z, R0, R0.w;\n"
221     "ADD R0.y, -R0.z, c[4];\n"
222     "RSQ R0.x, R0.x;\n"
223     "MAD_SAT R0.x, R0, R0.y, -c[4].z;\n"
224     "MUL R0.y, -R0.x, c[4].w;\n"
225     "ADD R0.y, R0, c[5].x;\n"
226     "MUL R0.x, R0, R0;\n"
227     "MUL result.color, R0.x, R0.y;\n"
228     "END\n"
229     ;
230 
231 static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_SOLID_COMPOSITION_MODES_SIMPLE_PORTER_DUFF =
232     "!!ARBfp1.0\n"
233     "PARAM c[7] = { program.local[0..5],\n"
234     "		{ 1 } };\n"
235     "TEMP R0;\n"
236     "TEMP R1;\n"
237     "TEMP R2;\n"
238     "TEMP R3;\n"
239     "MUL R0.xy, fragment.position, c[3];\n"
240     "TEX R0, R0, texture[0], 2D;\n"
241     "MUL R1.xyz, R0, c[0].y;\n"
242     "MUL R2.xyz, fragment.color.primary.w, R1;\n"
243     "MUL R1.xyz, fragment.color.primary, c[0].x;\n"
244     "MAD R2.xyz, R0.w, R1, R2;\n"
245     "ADD R3.xy, fragment.position, c[4];\n"
246     "ADD R1.w, -R0, c[6].x;\n"
247     "MUL R1.xyz, fragment.color.primary, c[1].y;\n"
248     "MAD R2.xyz, R1.w, R1, R2;\n"
249     "MUL R1.xyz, R0, c[1].z;\n"
250     "ADD R2.w, -fragment.color.primary, c[6].x;\n"
251     "MAD R2.xyz, R2.w, R1, R2;\n"
252     "MUL R1.z, R0.w, R2.w;\n"
253     "MUL R1.x, fragment.color.primary.w, R0.w;\n"
254     "MUL R1.y, fragment.color.primary.w, R1.w;\n"
255     "DP3 R2.w, R1, c[1];\n"
256     "MUL R3.xy, R3, c[2];\n"
257     "TEX R1, R3, texture[1], 2D;\n"
258     "ADD R2, R2, -R0;\n"
259     "DP4 R1.x, R1, c[5];\n"
260     "MAD result.color, R1.x, R2, R0;\n"
261     "END\n"
262     ;
263 
264 static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_SOLID_COMPOSITION_MODES_MULTIPLY =
265     "!!ARBfp1.0\n"
266     "PARAM c[5] = { program.local[0..3],\n"
267     "		{ 1 } };\n"
268     "TEMP R0;\n"
269     "TEMP R1;\n"
270     "TEMP R2;\n"
271     "MUL R0.xy, fragment.position, c[1];\n"
272     "TEX R0, R0, texture[0], 2D;\n"
273     "ADD R1.x, -R0.w, c[4];\n"
274     "MUL R1.xyz, fragment.color.primary, R1.x;\n"
275     "MAD R1.xyz, fragment.color.primary, R0, R1;\n"
276     "ADD R1.w, -fragment.color.primary, c[4].x;\n"
277     "MAD R2.xyz, R0, R1.w, R1;\n"
278     "ADD R1.z, fragment.color.primary.w, R0.w;\n"
279     "MAD R2.w, -fragment.color.primary, R0, R1.z;\n"
280     "ADD R1.xy, fragment.position, c[2];\n"
281     "MUL R1.xy, R1, c[0];\n"
282     "TEX R1, R1, texture[1], 2D;\n"
283     "ADD R2, R2, -R0;\n"
284     "DP4 R1.x, R1, c[3];\n"
285     "MAD result.color, R1.x, R2, R0;\n"
286     "END\n"
287     ;
288 
289 static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_SOLID_COMPOSITION_MODES_SCREEN =
290     "!!ARBfp1.0\n"
291     "PARAM c[4] = { program.local[0..3] };\n"
292     "TEMP R0;\n"
293     "TEMP R1;\n"
294     "TEMP R2;\n"
295     "MUL R0.xy, fragment.position, c[1];\n"
296     "TEX R0, R0, texture[0], 2D;\n"
297     "ADD R1.xy, fragment.position, c[2];\n"
298     "ADD R2, fragment.color.primary, R0;\n"
299     "MUL R1.xy, R1, c[0];\n"
300     "MAD R2, -fragment.color.primary, R0, R2;\n"
301     "TEX R1, R1, texture[1], 2D;\n"
302     "ADD R2, R2, -R0;\n"
303     "DP4 R1.x, R1, c[3];\n"
304     "MAD result.color, R1.x, R2, R0;\n"
305     "END\n"
306     ;
307 
308 static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_SOLID_COMPOSITION_MODES_OVERLAY =
309     "!!ARBfp1.0\n"
310     "PARAM c[5] = { program.local[0..3],\n"
311     "		{ 2, 1 } };\n"
312     "TEMP R0;\n"
313     "TEMP R1;\n"
314     "TEMP R2;\n"
315     "TEMP R3;\n"
316     "MUL R0.xy, fragment.position, c[1];\n"
317     "TEX R1, R0, texture[0], 2D;\n"
318     "ADD R0.w, -R1, c[4].y;\n"
319     "MUL R3.xyz, fragment.color.primary, R0.w;\n"
320     "ADD R2.xyz, fragment.color.primary.w, -fragment.color.primary;\n"
321     "ADD R0.xyz, R1.w, -R1;\n"
322     "MUL R0.xyz, R0, R2;\n"
323     "MUL R0.xyz, R0, c[4].x;\n"
324     "MAD R0.xyz, fragment.color.primary.w, R1.w, -R0;\n"
325     "MAD R0.xyz, fragment.color.primary, R0.w, R0;\n"
326     "MUL R2.xyz, fragment.color.primary, R1;\n"
327     "MAD R2.xyz, R2, c[4].x, R3;\n"
328     "ADD R0.w, -fragment.color.primary, c[4].y;\n"
329     "MAD R3.xyz, R1, R0.w, R0;\n"
330     "MAD R2.xyz, R1, R0.w, R2;\n"
331     "MUL R0.xyz, R1, c[4].x;\n"
332     "SGE R0.xyz, R0, R1.w;\n"
333     "ADD R3.xyz, R3, -R2;\n"
334     "MAD R2.xyz, R0, R3, R2;\n"
335     "ADD R0.z, fragment.color.primary.w, R1.w;\n"
336     "MAD R2.w, -fragment.color.primary, R1, R0.z;\n"
337     "ADD R0.xy, fragment.position, c[2];\n"
338     "MUL R0.xy, R0, c[0];\n"
339     "TEX R0, R0, texture[1], 2D;\n"
340     "ADD R2, R2, -R1;\n"
341     "DP4 R0.x, R0, c[3];\n"
342     "MAD result.color, R0.x, R2, R1;\n"
343     "END\n"
344     ;
345 
346 static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_SOLID_COMPOSITION_MODES_DARKEN =
347     "!!ARBfp1.0\n"
348     "PARAM c[5] = { program.local[0..3],\n"
349     "		{ 1 } };\n"
350     "TEMP R0;\n"
351     "TEMP R1;\n"
352     "TEMP R2;\n"
353     "MUL R0.xy, fragment.position, c[1];\n"
354     "TEX R0, R0, texture[0], 2D;\n"
355     "MUL R2.xyz, fragment.color.primary.w, R0;\n"
356     "MUL R1.xyz, fragment.color.primary, R0.w;\n"
357     "MIN R1.xyz, R1, R2;\n"
358     "ADD R1.w, -R0, c[4].x;\n"
359     "MAD R1.xyz, fragment.color.primary, R1.w, R1;\n"
360     "ADD R1.w, -fragment.color.primary, c[4].x;\n"
361     "MAD R2.xyz, R0, R1.w, R1;\n"
362     "ADD R1.z, fragment.color.primary.w, R0.w;\n"
363     "MAD R2.w, -fragment.color.primary, R0, R1.z;\n"
364     "ADD R1.xy, fragment.position, c[2];\n"
365     "MUL R1.xy, R1, c[0];\n"
366     "TEX R1, R1, texture[1], 2D;\n"
367     "ADD R2, R2, -R0;\n"
368     "DP4 R1.x, R1, c[3];\n"
369     "MAD result.color, R1.x, R2, R0;\n"
370     "END\n"
371     ;
372 
373 static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_SOLID_COMPOSITION_MODES_LIGHTEN =
374     "!!ARBfp1.0\n"
375     "PARAM c[5] = { program.local[0..3],\n"
376     "		{ 1 } };\n"
377     "TEMP R0;\n"
378     "TEMP R1;\n"
379     "TEMP R2;\n"
380     "MUL R0.xy, fragment.position, c[1];\n"
381     "TEX R0, R0, texture[0], 2D;\n"
382     "MUL R2.xyz, fragment.color.primary.w, R0;\n"
383     "MUL R1.xyz, fragment.color.primary, R0.w;\n"
384     "MAX R1.xyz, R1, R2;\n"
385     "ADD R1.w, -R0, c[4].x;\n"
386     "MAD R1.xyz, fragment.color.primary, R1.w, R1;\n"
387     "ADD R1.w, -fragment.color.primary, c[4].x;\n"
388     "MAD R2.xyz, R0, R1.w, R1;\n"
389     "ADD R1.z, fragment.color.primary.w, R0.w;\n"
390     "MAD R2.w, -fragment.color.primary, R0, R1.z;\n"
391     "ADD R1.xy, fragment.position, c[2];\n"
392     "MUL R1.xy, R1, c[0];\n"
393     "TEX R1, R1, texture[1], 2D;\n"
394     "ADD R2, R2, -R0;\n"
395     "DP4 R1.x, R1, c[3];\n"
396     "MAD result.color, R1.x, R2, R0;\n"
397     "END\n"
398     ;
399 
400 static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_SOLID_COMPOSITION_MODES_COLORDODGE =
401     "!!ARBfp1.0\n"
402     "PARAM c[5] = { program.local[0..3],\n"
403     "		{ 1, 1e-006 } };\n"
404     "TEMP R0;\n"
405     "TEMP R1;\n"
406     "TEMP R2;\n"
407     "TEMP R3;\n"
408     "MUL R0.xy, fragment.position, c[1];\n"
409     "TEX R0, R0, texture[0], 2D;\n"
410     "ADD R1.x, -fragment.color.primary.w, c[4];\n"
411     "MAX R1.y, fragment.color.primary.w, c[4];\n"
412     "MUL R2.xyz, R0, R1.x;\n"
413     "ADD R1.w, -R0, c[4].x;\n"
414     "MAD R3.xyz, fragment.color.primary, R1.w, R2;\n"
415     "RCP R1.y, R1.y;\n"
416     "MAD R1.xyz, -fragment.color.primary, R1.y, c[4].x;\n"
417     "MAX R1.xyz, R1, c[4].y;\n"
418     "MUL R2.xyz, fragment.color.primary.w, R0;\n"
419     "MUL R1.w, fragment.color.primary, R0;\n"
420     "RCP R1.x, R1.x;\n"
421     "RCP R1.y, R1.y;\n"
422     "RCP R1.z, R1.z;\n"
423     "MAD R1.xyz, R2, R1, R3;\n"
424     "MAD R3.xyz, fragment.color.primary.w, R0.w, R3;\n"
425     "MAD R2.xyz, fragment.color.primary, R0.w, R2;\n"
426     "ADD R3.xyz, R3, -R1;\n"
427     "SGE R2.xyz, R2, R1.w;\n"
428     "MAD R2.xyz, R2, R3, R1;\n"
429     "ADD R1.z, fragment.color.primary.w, R0.w;\n"
430     "MAD R2.w, -fragment.color.primary, R0, R1.z;\n"
431     "ADD R1.xy, fragment.position, c[2];\n"
432     "MUL R1.xy, R1, c[0];\n"
433     "TEX R1, R1, texture[1], 2D;\n"
434     "ADD R2, R2, -R0;\n"
435     "DP4 R1.x, R1, c[3];\n"
436     "MAD result.color, R1.x, R2, R0;\n"
437     "END\n"
438     ;
439 
440 static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_SOLID_COMPOSITION_MODES_COLORBURN =
441     "!!ARBfp1.0\n"
442     "PARAM c[5] = { program.local[0..3],\n"
443     "		{ 1, 9.9999997e-006 } };\n"
444     "TEMP R0;\n"
445     "TEMP R1;\n"
446     "TEMP R2;\n"
447     "TEMP R3;\n"
448     "TEMP R4;\n"
449     "MUL R0.xy, fragment.position, c[1];\n"
450     "TEX R0, R0, texture[0], 2D;\n"
451     "ADD R1.w, -R0, c[4].x;\n"
452     "MUL R1.xyz, fragment.color.primary.w, R0;\n"
453     "MAD R2.xyz, fragment.color.primary, R0.w, R1;\n"
454     "MAD R1.xyz, -fragment.color.primary.w, R0.w, R2;\n"
455     "MUL R3.xyz, fragment.color.primary.w, R1;\n"
456     "MAX R1.xyz, fragment.color.primary, c[4].y;\n"
457     "ADD R2.w, -fragment.color.primary, c[4].x;\n"
458     "MUL R4.xyz, fragment.color.primary, R1.w;\n"
459     "RCP R1.x, R1.x;\n"
460     "RCP R1.y, R1.y;\n"
461     "RCP R1.z, R1.z;\n"
462     "MAD R3.xyz, R3, R1, R4;\n"
463     "MUL R1.xyz, R0, R2.w;\n"
464     "MAD R1.xyz, fragment.color.primary, R1.w, R1;\n"
465     "MAD R3.xyz, R0, R2.w, R3;\n"
466     "MUL R1.w, fragment.color.primary, R0;\n"
467     "ADD R3.xyz, R3, -R1;\n"
468     "SGE R2.xyz, R2, R1.w;\n"
469     "MAD R2.xyz, R2, R3, R1;\n"
470     "ADD R1.z, fragment.color.primary.w, R0.w;\n"
471     "MAD R2.w, -fragment.color.primary, R0, R1.z;\n"
472     "ADD R1.xy, fragment.position, c[2];\n"
473     "MUL R1.xy, R1, c[0];\n"
474     "TEX R1, R1, texture[1], 2D;\n"
475     "ADD R2, R2, -R0;\n"
476     "DP4 R1.x, R1, c[3];\n"
477     "MAD result.color, R1.x, R2, R0;\n"
478     "END\n"
479     ;
480 
481 static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_SOLID_COMPOSITION_MODES_HARDLIGHT =
482     "!!ARBfp1.0\n"
483     "PARAM c[5] = { program.local[0..3],\n"
484     "		{ 2, 1 } };\n"
485     "TEMP R0;\n"
486     "TEMP R1;\n"
487     "TEMP R2;\n"
488     "TEMP R3;\n"
489     "MUL R0.xy, fragment.position, c[1];\n"
490     "TEX R1, R0, texture[0], 2D;\n"
491     "ADD R0.w, -R1, c[4].y;\n"
492     "MUL R3.xyz, fragment.color.primary, R0.w;\n"
493     "ADD R2.xyz, fragment.color.primary.w, -fragment.color.primary;\n"
494     "ADD R0.xyz, R1.w, -R1;\n"
495     "MUL R0.xyz, R0, R2;\n"
496     "MUL R0.xyz, R0, c[4].x;\n"
497     "MAD R0.xyz, fragment.color.primary.w, R1.w, -R0;\n"
498     "MAD R0.xyz, fragment.color.primary, R0.w, R0;\n"
499     "MUL R2.xyz, fragment.color.primary, R1;\n"
500     "MAD R2.xyz, R2, c[4].x, R3;\n"
501     "ADD R0.w, -fragment.color.primary, c[4].y;\n"
502     "MAD R3.xyz, R1, R0.w, R0;\n"
503     "MAD R2.xyz, R1, R0.w, R2;\n"
504     "MUL R0.xyz, fragment.color.primary, c[4].x;\n"
505     "SGE R0.xyz, R0, fragment.color.primary.w;\n"
506     "ADD R3.xyz, R3, -R2;\n"
507     "MAD R2.xyz, R0, R3, R2;\n"
508     "ADD R0.z, fragment.color.primary.w, R1.w;\n"
509     "MAD R2.w, -fragment.color.primary, R1, R0.z;\n"
510     "ADD R0.xy, fragment.position, c[2];\n"
511     "MUL R0.xy, R0, c[0];\n"
512     "TEX R0, R0, texture[1], 2D;\n"
513     "ADD R2, R2, -R1;\n"
514     "DP4 R0.x, R0, c[3];\n"
515     "MAD result.color, R0.x, R2, R1;\n"
516     "END\n"
517     ;
518 
519 static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_SOLID_COMPOSITION_MODES_SOFTLIGHT =
520     "!!ARBfp1.0\n"
521     "PARAM c[6] = { program.local[0..3],\n"
522     "		{ 1, 2, 9.9999997e-006, 4 },\n"
523     "		{ 16, 12, 3 } };\n"
524     "TEMP R0;\n"
525     "TEMP R1;\n"
526     "TEMP R2;\n"
527     "TEMP R3;\n"
528     "TEMP R4;\n"
529     "TEMP R5;\n"
530     "MUL R0.xy, fragment.position, c[1];\n"
531     "TEX R0, R0, texture[0], 2D;\n"
532     "MAX R1.x, R0.w, c[4].z;\n"
533     "RCP R1.x, R1.x;\n"
534     "MUL R2.xyz, R0, R1.x;\n"
535     "MAD R1.xyz, R2, c[5].x, -c[5].y;\n"
536     "MAD R3.xyz, R2, R1, c[5].z;\n"
537     "MAD R1.xyz, fragment.color.primary, c[4].y, -fragment.color.primary.w;\n"
538     "MUL R4.xyz, R0.w, R1;\n"
539     "MUL R5.xyz, R4, R3;\n"
540     "RSQ R1.w, R2.x;\n"
541     "RSQ R2.w, R2.z;\n"
542     "RCP R3.x, R1.w;\n"
543     "RSQ R1.w, R2.y;\n"
544     "MUL R5.xyz, R2, R5;\n"
545     "RCP R3.z, R2.w;\n"
546     "RCP R3.y, R1.w;\n"
547     "ADD R3.xyz, -R2, R3;\n"
548     "MUL R3.xyz, R4, R3;\n"
549     "ADD R2.xyz, -R2, c[4].x;\n"
550     "MAD R1.xyz, R1, R2, fragment.color.primary.w;\n"
551     "MUL R2.xyz, fragment.color.primary, c[4].y;\n"
552     "MAD R4.xyz, fragment.color.primary.w, R0, R5;\n"
553     "MAD R3.xyz, fragment.color.primary.w, R0, R3;\n"
554     "ADD R5.xyz, R3, -R4;\n"
555     "MUL R3.xyz, R0, c[4].w;\n"
556     "SGE R3.xyz, R3, R0.w;\n"
557     "MAD R3.xyz, R3, R5, R4;\n"
558     "MAD R3.xyz, -R0, R1, R3;\n"
559     "MUL R1.xyz, R0, R1;\n"
560     "SGE R2.xyz, R2, fragment.color.primary.w;\n"
561     "MAD R2.xyz, R2, R3, R1;\n"
562     "ADD R1.x, -R0.w, c[4];\n"
563     "MAD R2.xyz, fragment.color.primary, R1.x, R2;\n"
564     "ADD R1.x, -fragment.color.primary.w, c[4];\n"
565     "MAD R2.xyz, R0, R1.x, R2;\n"
566     "ADD R1.z, fragment.color.primary.w, R0.w;\n"
567     "MAD R2.w, -fragment.color.primary, R0, R1.z;\n"
568     "ADD R1.xy, fragment.position, c[2];\n"
569     "MUL R1.xy, R1, c[0];\n"
570     "TEX R1, R1, texture[1], 2D;\n"
571     "ADD R2, R2, -R0;\n"
572     "DP4 R1.x, R1, c[3];\n"
573     "MAD result.color, R1.x, R2, R0;\n"
574     "END\n"
575     ;
576 
577 static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_SOLID_COMPOSITION_MODES_DIFFERENCE =
578     "!!ARBfp1.0\n"
579     "PARAM c[5] = { program.local[0..3],\n"
580     "		{ 2 } };\n"
581     "TEMP R0;\n"
582     "TEMP R1;\n"
583     "TEMP R2;\n"
584     "TEMP R3;\n"
585     "MUL R0.xy, fragment.position, c[1];\n"
586     "TEX R0, R0, texture[0], 2D;\n"
587     "ADD R1.xyz, fragment.color.primary, R0;\n"
588     "MUL R3.xyz, fragment.color.primary.w, R0;\n"
589     "MUL R2.xyz, fragment.color.primary, R0.w;\n"
590     "MIN R2.xyz, R2, R3;\n"
591     "MAD R2.xyz, -R2, c[4].x, R1;\n"
592     "ADD R1.z, fragment.color.primary.w, R0.w;\n"
593     "MAD R2.w, -fragment.color.primary, R0, R1.z;\n"
594     "ADD R1.xy, fragment.position, c[2];\n"
595     "MUL R1.xy, R1, c[0];\n"
596     "TEX R1, R1, texture[1], 2D;\n"
597     "ADD R2, R2, -R0;\n"
598     "DP4 R1.x, R1, c[3];\n"
599     "MAD result.color, R1.x, R2, R0;\n"
600     "END\n"
601     ;
602 
603 static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_SOLID_COMPOSITION_MODES_EXCLUSION =
604     "!!ARBfp1.0\n"
605     "PARAM c[5] = { program.local[0..3],\n"
606     "		{ 2, 1 } };\n"
607     "TEMP R0;\n"
608     "TEMP R1;\n"
609     "TEMP R2;\n"
610     "MUL R0.xy, fragment.position, c[1];\n"
611     "TEX R0, R0, texture[0], 2D;\n"
612     "MUL R1.xyz, fragment.color.primary.w, R0;\n"
613     "MAD R2.xyz, fragment.color.primary, R0.w, R1;\n"
614     "MUL R1.xyz, fragment.color.primary, R0;\n"
615     "MAD R1.xyz, -R1, c[4].x, R2;\n"
616     "ADD R1.w, -R0, c[4].y;\n"
617     "MAD R1.xyz, fragment.color.primary, R1.w, R1;\n"
618     "ADD R1.w, -fragment.color.primary, c[4].y;\n"
619     "MAD R2.xyz, R0, R1.w, R1;\n"
620     "ADD R1.z, fragment.color.primary.w, R0.w;\n"
621     "MAD R2.w, -fragment.color.primary, R0, R1.z;\n"
622     "ADD R1.xy, fragment.position, c[2];\n"
623     "MUL R1.xy, R1, c[0];\n"
624     "TEX R1, R1, texture[1], 2D;\n"
625     "ADD R2, R2, -R0;\n"
626     "DP4 R1.x, R1, c[3];\n"
627     "MAD result.color, R1.x, R2, R0;\n"
628     "END\n"
629     ;
630 
631 static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_SOLID_COMPOSITION_MODES_SIMPLE_PORTER_DUFF_NOMASK =
632     "!!ARBfp1.0\n"
633     "PARAM c[4] = { program.local[0..2],\n"
634     "		{ 1 } };\n"
635     "TEMP R0;\n"
636     "TEMP R1;\n"
637     "TEMP R2;\n"
638     "MUL R0.xy, fragment.position, c[2];\n"
639     "TEX R0, R0, texture[0], 2D;\n"
640     "MUL R1.xyz, R0, c[0].y;\n"
641     "MUL R2.xyz, fragment.color.primary.w, R1;\n"
642     "MUL R1.xyz, fragment.color.primary, c[0].x;\n"
643     "MAD R2.xyz, R0.w, R1, R2;\n"
644     "MUL R0.xyz, R0, c[1].z;\n"
645     "ADD R1.w, -R0, c[3].x;\n"
646     "MUL R1.xyz, fragment.color.primary, c[1].y;\n"
647     "MAD R1.xyz, R1.w, R1, R2;\n"
648     "ADD R2.x, -fragment.color.primary.w, c[3];\n"
649     "MAD result.color.xyz, R2.x, R0, R1;\n"
650     "MUL R0.x, fragment.color.primary.w, R0.w;\n"
651     "MUL R0.z, R0.w, R2.x;\n"
652     "MUL R0.y, fragment.color.primary.w, R1.w;\n"
653     "DP3 result.color.w, R0, c[1];\n"
654     "END\n"
655     ;
656 
657 static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_SOLID_COMPOSITION_MODES_MULTIPLY_NOMASK =
658     "!!ARBfp1.0\n"
659     "PARAM c[2] = { program.local[0],\n"
660     "		{ 1 } };\n"
661     "TEMP R0;\n"
662     "TEMP R1;\n"
663     "TEMP R2;\n"
664     "MUL R0.xy, fragment.position, c[0];\n"
665     "TEX R0, R0, texture[0], 2D;\n"
666     "ADD R1.x, -R0.w, c[1];\n"
667     "MUL R1.xyz, fragment.color.primary, R1.x;\n"
668     "ADD R1.w, fragment.color.primary, R0;\n"
669     "MAD R1.xyz, fragment.color.primary, R0, R1;\n"
670     "ADD R2.x, -fragment.color.primary.w, c[1];\n"
671     "MAD result.color.xyz, R0, R2.x, R1;\n"
672     "MAD result.color.w, -fragment.color.primary, R0, R1;\n"
673     "END\n"
674     ;
675 
676 static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_SOLID_COMPOSITION_MODES_SCREEN_NOMASK =
677     "!!ARBfp1.0\n"
678     "PARAM c[1] = { program.local[0] };\n"
679     "TEMP R0;\n"
680     "TEMP R1;\n"
681     "MUL R0.xy, fragment.position, c[0];\n"
682     "TEX R0, R0, texture[0], 2D;\n"
683     "ADD R1, fragment.color.primary, R0;\n"
684     "MAD result.color, -fragment.color.primary, R0, R1;\n"
685     "END\n"
686     ;
687 
688 static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_SOLID_COMPOSITION_MODES_OVERLAY_NOMASK =
689     "!!ARBfp1.0\n"
690     "PARAM c[2] = { program.local[0],\n"
691     "		{ 2, 1 } };\n"
692     "TEMP R0;\n"
693     "TEMP R1;\n"
694     "TEMP R2;\n"
695     "TEMP R3;\n"
696     "MUL R0.xy, fragment.position, c[0];\n"
697     "TEX R0, R0, texture[0], 2D;\n"
698     "ADD R1.w, -R0, c[1].y;\n"
699     "ADD R2.xyz, fragment.color.primary.w, -fragment.color.primary;\n"
700     "ADD R1.xyz, R0.w, -R0;\n"
701     "MUL R1.xyz, R1, R2;\n"
702     "MUL R1.xyz, R1, c[1].x;\n"
703     "MAD R1.xyz, fragment.color.primary.w, R0.w, -R1;\n"
704     "MUL R3.xyz, fragment.color.primary, R1.w;\n"
705     "MUL R2.xyz, fragment.color.primary, R0;\n"
706     "MAD R1.xyz, fragment.color.primary, R1.w, R1;\n"
707     "ADD R1.w, -fragment.color.primary, c[1].y;\n"
708     "MAD R2.xyz, R2, c[1].x, R3;\n"
709     "MAD R2.xyz, R0, R1.w, R2;\n"
710     "MAD R1.xyz, R0, R1.w, R1;\n"
711     "MUL R0.xyz, R0, c[1].x;\n"
712     "ADD R1.w, fragment.color.primary, R0;\n"
713     "ADD R1.xyz, R1, -R2;\n"
714     "SGE R0.xyz, R0, R0.w;\n"
715     "MAD result.color.xyz, R0, R1, R2;\n"
716     "MAD result.color.w, -fragment.color.primary, R0, R1;\n"
717     "END\n"
718     ;
719 
720 static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_SOLID_COMPOSITION_MODES_DARKEN_NOMASK =
721     "!!ARBfp1.0\n"
722     "PARAM c[2] = { program.local[0],\n"
723     "		{ 1 } };\n"
724     "TEMP R0;\n"
725     "TEMP R1;\n"
726     "TEMP R2;\n"
727     "MUL R0.xy, fragment.position, c[0];\n"
728     "TEX R0, R0, texture[0], 2D;\n"
729     "MUL R2.xyz, fragment.color.primary.w, R0;\n"
730     "MUL R1.xyz, fragment.color.primary, R0.w;\n"
731     "MIN R1.xyz, R1, R2;\n"
732     "ADD R1.w, -R0, c[1].x;\n"
733     "MAD R1.xyz, fragment.color.primary, R1.w, R1;\n"
734     "ADD R1.w, fragment.color.primary, R0;\n"
735     "ADD R2.x, -fragment.color.primary.w, c[1];\n"
736     "MAD result.color.xyz, R0, R2.x, R1;\n"
737     "MAD result.color.w, -fragment.color.primary, R0, R1;\n"
738     "END\n"
739     ;
740 
741 static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_SOLID_COMPOSITION_MODES_LIGHTEN_NOMASK =
742     "!!ARBfp1.0\n"
743     "PARAM c[2] = { program.local[0],\n"
744     "		{ 1 } };\n"
745     "TEMP R0;\n"
746     "TEMP R1;\n"
747     "TEMP R2;\n"
748     "MUL R0.xy, fragment.position, c[0];\n"
749     "TEX R0, R0, texture[0], 2D;\n"
750     "MUL R2.xyz, fragment.color.primary.w, R0;\n"
751     "MUL R1.xyz, fragment.color.primary, R0.w;\n"
752     "MAX R1.xyz, R1, R2;\n"
753     "ADD R1.w, -R0, c[1].x;\n"
754     "MAD R1.xyz, fragment.color.primary, R1.w, R1;\n"
755     "ADD R1.w, fragment.color.primary, R0;\n"
756     "ADD R2.x, -fragment.color.primary.w, c[1];\n"
757     "MAD result.color.xyz, R0, R2.x, R1;\n"
758     "MAD result.color.w, -fragment.color.primary, R0, R1;\n"
759     "END\n"
760     ;
761 
762 static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_SOLID_COMPOSITION_MODES_COLORDODGE_NOMASK =
763     "!!ARBfp1.0\n"
764     "PARAM c[2] = { program.local[0],\n"
765     "		{ 1, 1e-006 } };\n"
766     "TEMP R0;\n"
767     "TEMP R1;\n"
768     "TEMP R2;\n"
769     "MAX R1.y, fragment.color.primary.w, c[1];\n"
770     "RCP R2.x, R1.y;\n"
771     "MUL R0.xy, fragment.position, c[0];\n"
772     "TEX R0, R0, texture[0], 2D;\n"
773     "ADD R1.x, -fragment.color.primary.w, c[1];\n"
774     "MUL R1.xyz, R0, R1.x;\n"
775     "ADD R1.w, -R0, c[1].x;\n"
776     "MAD R1.xyz, fragment.color.primary, R1.w, R1;\n"
777     "MAD R2.xyz, -fragment.color.primary, R2.x, c[1].x;\n"
778     "MAX R2.xyz, R2, c[1].y;\n"
779     "MUL R0.xyz, fragment.color.primary.w, R0;\n"
780     "MUL R1.w, fragment.color.primary, R0;\n"
781     "RCP R2.x, R2.x;\n"
782     "RCP R2.y, R2.y;\n"
783     "RCP R2.z, R2.z;\n"
784     "MAD R2.xyz, R0, R2, R1;\n"
785     "MAD R1.xyz, fragment.color.primary.w, R0.w, R1;\n"
786     "MAD R0.xyz, fragment.color.primary, R0.w, R0;\n"
787     "SGE R0.xyz, R0, R1.w;\n"
788     "ADD R1.xyz, R1, -R2;\n"
789     "ADD R1.w, fragment.color.primary, R0;\n"
790     "MAD result.color.xyz, R0, R1, R2;\n"
791     "MAD result.color.w, -fragment.color.primary, R0, R1;\n"
792     "END\n"
793     ;
794 
795 static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_SOLID_COMPOSITION_MODES_COLORBURN_NOMASK =
796     "!!ARBfp1.0\n"
797     "PARAM c[2] = { program.local[0],\n"
798     "		{ 1, 9.9999997e-006 } };\n"
799     "TEMP R0;\n"
800     "TEMP R1;\n"
801     "TEMP R2;\n"
802     "TEMP R3;\n"
803     "TEMP R4;\n"
804     "MUL R0.xy, fragment.position, c[0];\n"
805     "TEX R0, R0, texture[0], 2D;\n"
806     "MUL R1.xyz, fragment.color.primary.w, R0;\n"
807     "MAD R2.xyz, fragment.color.primary, R0.w, R1;\n"
808     "MAD R1.xyz, -fragment.color.primary.w, R0.w, R2;\n"
809     "MUL R3.xyz, fragment.color.primary.w, R1;\n"
810     "MAX R1.xyz, fragment.color.primary, c[1].y;\n"
811     "ADD R1.w, -R0, c[1].x;\n"
812     "MUL R4.xyz, fragment.color.primary, R1.w;\n"
813     "ADD R2.w, -fragment.color.primary, c[1].x;\n"
814     "RCP R1.x, R1.x;\n"
815     "RCP R1.y, R1.y;\n"
816     "RCP R1.z, R1.z;\n"
817     "MAD R1.xyz, R3, R1, R4;\n"
818     "MUL R3.xyz, R0, R2.w;\n"
819     "MAD R0.xyz, R0, R2.w, R1;\n"
820     "MAD R1.xyz, fragment.color.primary, R1.w, R3;\n"
821     "MUL R1.w, fragment.color.primary, R0;\n"
822     "SGE R2.xyz, R2, R1.w;\n"
823     "ADD R0.xyz, R0, -R1;\n"
824     "ADD R1.w, fragment.color.primary, R0;\n"
825     "MAD result.color.xyz, R2, R0, R1;\n"
826     "MAD result.color.w, -fragment.color.primary, R0, R1;\n"
827     "END\n"
828     ;
829 
830 static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_SOLID_COMPOSITION_MODES_HARDLIGHT_NOMASK =
831     "!!ARBfp1.0\n"
832     "PARAM c[2] = { program.local[0],\n"
833     "		{ 2, 1 } };\n"
834     "TEMP R0;\n"
835     "TEMP R1;\n"
836     "TEMP R2;\n"
837     "TEMP R3;\n"
838     "MUL R0.xy, fragment.position, c[0];\n"
839     "TEX R0, R0, texture[0], 2D;\n"
840     "ADD R1.w, -R0, c[1].y;\n"
841     "ADD R2.xyz, fragment.color.primary.w, -fragment.color.primary;\n"
842     "ADD R1.xyz, R0.w, -R0;\n"
843     "MUL R1.xyz, R1, R2;\n"
844     "MUL R1.xyz, R1, c[1].x;\n"
845     "MAD R1.xyz, fragment.color.primary.w, R0.w, -R1;\n"
846     "MAD R1.xyz, fragment.color.primary, R1.w, R1;\n"
847     "MUL R3.xyz, fragment.color.primary, R1.w;\n"
848     "MUL R2.xyz, fragment.color.primary, R0;\n"
849     "ADD R1.w, -fragment.color.primary, c[1].y;\n"
850     "MAD R2.xyz, R2, c[1].x, R3;\n"
851     "MAD R2.xyz, R0, R1.w, R2;\n"
852     "MAD R0.xyz, R0, R1.w, R1;\n"
853     "ADD R1.xyz, R0, -R2;\n"
854     "MUL R0.xyz, fragment.color.primary, c[1].x;\n"
855     "ADD R1.w, fragment.color.primary, R0;\n"
856     "SGE R0.xyz, R0, fragment.color.primary.w;\n"
857     "MAD result.color.xyz, R0, R1, R2;\n"
858     "MAD result.color.w, -fragment.color.primary, R0, R1;\n"
859     "END\n"
860     ;
861 
862 static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_SOLID_COMPOSITION_MODES_SOFTLIGHT_NOMASK =
863     "!!ARBfp1.0\n"
864     "PARAM c[3] = { program.local[0],\n"
865     "		{ 1, 2, 9.9999997e-006, 4 },\n"
866     "		{ 16, 12, 3 } };\n"
867     "TEMP R0;\n"
868     "TEMP R1;\n"
869     "TEMP R2;\n"
870     "TEMP R3;\n"
871     "TEMP R4;\n"
872     "TEMP R5;\n"
873     "MUL R0.xy, fragment.position, c[0];\n"
874     "TEX R0, R0, texture[0], 2D;\n"
875     "MAX R1.x, R0.w, c[1].z;\n"
876     "RCP R1.x, R1.x;\n"
877     "MUL R2.xyz, R0, R1.x;\n"
878     "MAD R1.xyz, R2, c[2].x, -c[2].y;\n"
879     "MAD R3.xyz, R2, R1, c[2].z;\n"
880     "MAD R1.xyz, fragment.color.primary, c[1].y, -fragment.color.primary.w;\n"
881     "MUL R4.xyz, R0.w, R1;\n"
882     "MUL R5.xyz, R4, R3;\n"
883     "RSQ R1.w, R2.x;\n"
884     "RCP R3.x, R1.w;\n"
885     "RSQ R2.w, R2.z;\n"
886     "RSQ R1.w, R2.y;\n"
887     "MUL R5.xyz, R2, R5;\n"
888     "RCP R3.z, R2.w;\n"
889     "RCP R3.y, R1.w;\n"
890     "ADD R3.xyz, -R2, R3;\n"
891     "MUL R3.xyz, R4, R3;\n"
892     "ADD R2.xyz, -R2, c[1].x;\n"
893     "MAD R1.xyz, R1, R2, fragment.color.primary.w;\n"
894     "MUL R2.xyz, fragment.color.primary, c[1].y;\n"
895     "MAD R4.xyz, fragment.color.primary.w, R0, R5;\n"
896     "MAD R3.xyz, fragment.color.primary.w, R0, R3;\n"
897     "ADD R5.xyz, R3, -R4;\n"
898     "MUL R3.xyz, R0, c[1].w;\n"
899     "SGE R3.xyz, R3, R0.w;\n"
900     "MAD R3.xyz, R3, R5, R4;\n"
901     "MAD R3.xyz, -R0, R1, R3;\n"
902     "MUL R1.xyz, R0, R1;\n"
903     "SGE R2.xyz, R2, fragment.color.primary.w;\n"
904     "MAD R2.xyz, R2, R3, R1;\n"
905     "ADD R1.x, -R0.w, c[1];\n"
906     "MAD R2.xyz, fragment.color.primary, R1.x, R2;\n"
907     "ADD R1.x, fragment.color.primary.w, R0.w;\n"
908     "ADD R1.y, -fragment.color.primary.w, c[1].x;\n"
909     "MAD result.color.xyz, R0, R1.y, R2;\n"
910     "MAD result.color.w, -fragment.color.primary, R0, R1.x;\n"
911     "END\n"
912     ;
913 
914 static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_SOLID_COMPOSITION_MODES_DIFFERENCE_NOMASK =
915     "!!ARBfp1.0\n"
916     "PARAM c[2] = { program.local[0],\n"
917     "		{ 2 } };\n"
918     "TEMP R0;\n"
919     "TEMP R1;\n"
920     "TEMP R2;\n"
921     "MUL R0.xy, fragment.position, c[0];\n"
922     "TEX R0, R0, texture[0], 2D;\n"
923     "MUL R2.xyz, fragment.color.primary.w, R0;\n"
924     "MUL R1.xyz, fragment.color.primary, R0.w;\n"
925     "ADD R1.w, fragment.color.primary, R0;\n"
926     "MIN R1.xyz, R1, R2;\n"
927     "ADD R0.xyz, fragment.color.primary, R0;\n"
928     "MAD result.color.xyz, -R1, c[1].x, R0;\n"
929     "MAD result.color.w, -fragment.color.primary, R0, R1;\n"
930     "END\n"
931     ;
932 
933 static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_SOLID_COMPOSITION_MODES_EXCLUSION_NOMASK =
934     "!!ARBfp1.0\n"
935     "PARAM c[2] = { program.local[0],\n"
936     "		{ 2, 1 } };\n"
937     "TEMP R0;\n"
938     "TEMP R1;\n"
939     "TEMP R2;\n"
940     "MUL R0.xy, fragment.position, c[0];\n"
941     "TEX R0, R0, texture[0], 2D;\n"
942     "MUL R1.xyz, fragment.color.primary.w, R0;\n"
943     "MAD R2.xyz, fragment.color.primary, R0.w, R1;\n"
944     "MUL R1.xyz, fragment.color.primary, R0;\n"
945     "MAD R1.xyz, -R1, c[1].x, R2;\n"
946     "ADD R1.w, -R0, c[1].y;\n"
947     "MAD R1.xyz, fragment.color.primary, R1.w, R1;\n"
948     "ADD R1.w, fragment.color.primary, R0;\n"
949     "ADD R2.x, -fragment.color.primary.w, c[1].y;\n"
950     "MAD result.color.xyz, R0, R2.x, R1;\n"
951     "MAD result.color.w, -fragment.color.primary, R0, R1;\n"
952     "END\n"
953     ;
954 
955 static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_SOLID_COMPOSITION_MODE_BLEND_MODE_MASK =
956     "!!ARBfp1.0\n"
957     "PARAM c[3] = { program.local[0..2] };\n"
958     "TEMP R0;\n"
959     "ADD R0.xy, fragment.position, c[1];\n"
960     "MUL R0.xy, R0, c[0];\n"
961     "TEX R0, R0, texture[0], 2D;\n"
962     "DP4 R0.x, R0, c[2];\n"
963     "MUL result.color, fragment.color.primary, R0.x;\n"
964     "END\n"
965     ;
966 
967 static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_SOLID_COMPOSITION_MODE_BLEND_MODE_NOMASK =
968     "!!ARBfp1.0\n"
969     "MOV result.color, fragment.color.primary;\n"
970     "END\n"
971     ;
972 
973 static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_RADIAL_COMPOSITION_MODES_SIMPLE_PORTER_DUFF =
974     "!!ARBfp1.0\n"
975     "PARAM c[12] = { program.local[0..10],\n"
976     "		{ 2, 4, 1 } };\n"
977     "TEMP R0;\n"
978     "TEMP R1;\n"
979     "TEMP R2;\n"
980     "TEMP R3;\n"
981     "MUL R0.xyz, fragment.position.y, c[3];\n"
982     "MAD R0.xyz, fragment.position.x, c[2], R0;\n"
983     "ADD R0.xyz, R0, c[4];\n"
984     "RCP R0.z, R0.z;\n"
985     "MUL R0.xy, R0, R0.z;\n"
986     "MUL R0.zw, R0.xyxy, R0.xyxy;\n"
987     "ADD R0.z, R0, R0.w;\n"
988     "MUL R0.xy, R0, c[0];\n"
989     "ADD R0.x, R0, R0.y;\n"
990     "MUL R0.z, -R0, c[1].x;\n"
991     "MUL R0.y, R0.x, c[11].x;\n"
992     "MUL R0.z, R0, c[11].y;\n"
993     "MAD R0.x, R0.y, R0.y, -R0.z;\n"
994     "RSQ R0.x, R0.x;\n"
995     "RCP R0.z, R0.x;\n"
996     "ADD R1.x, -R0.y, R0.z;\n"
997     "MOV R0.x, c[11];\n"
998     "MUL R0.z, R0.x, c[1].x;\n"
999     "RCP R1.y, R0.z;\n"
1000     "MUL R0.xy, fragment.position, c[8];\n"
1001     "TEX R0, R0, texture[0], 2D;\n"
1002     "MUL R1.x, R1, R1.y;\n"
1003     "TEX R1, R1, texture[2], 1D;\n"
1004     "MUL R2.xyz, R0, c[5].y;\n"
1005     "MUL R3.xyz, R1.w, R2;\n"
1006     "MUL R2.xyz, R1, c[5].x;\n"
1007     "MAD R2.xyz, R0.w, R2, R3;\n"
1008     "ADD R3.xy, fragment.position, c[9];\n"
1009     "ADD R2.w, -R0, c[11].z;\n"
1010     "MUL R1.xyz, R1, c[6].y;\n"
1011     "MAD R2.xyz, R2.w, R1, R2;\n"
1012     "MUL R1.xyz, R0, c[6].z;\n"
1013     "ADD R3.z, -R1.w, c[11];\n"
1014     "MAD R2.xyz, R3.z, R1, R2;\n"
1015     "MUL R1.y, R1.w, R2.w;\n"
1016     "MUL R1.x, R1.w, R0.w;\n"
1017     "MUL R1.z, R0.w, R3;\n"
1018     "DP3 R2.w, R1, c[6];\n"
1019     "MUL R3.xy, R3, c[7];\n"
1020     "TEX R1, R3, texture[1], 2D;\n"
1021     "ADD R2, R2, -R0;\n"
1022     "DP4 R1.x, R1, c[10];\n"
1023     "MAD result.color, R1.x, R2, R0;\n"
1024     "END\n"
1025     ;
1026 
1027 static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_RADIAL_COMPOSITION_MODES_MULTIPLY =
1028     "!!ARBfp1.0\n"
1029     "PARAM c[10] = { program.local[0..8],\n"
1030     "		{ 2, 4, 1 } };\n"
1031     "TEMP R0;\n"
1032     "TEMP R1;\n"
1033     "TEMP R2;\n"
1034     "MUL R0.xyz, fragment.position.y, c[3];\n"
1035     "MAD R0.xyz, fragment.position.x, c[2], R0;\n"
1036     "ADD R0.xyz, R0, c[4];\n"
1037     "RCP R0.z, R0.z;\n"
1038     "MUL R0.xy, R0, R0.z;\n"
1039     "MUL R0.zw, R0.xyxy, R0.xyxy;\n"
1040     "ADD R0.z, R0, R0.w;\n"
1041     "MUL R0.xy, R0, c[0];\n"
1042     "ADD R0.x, R0, R0.y;\n"
1043     "MUL R0.z, -R0, c[1].x;\n"
1044     "MUL R0.y, R0.x, c[9].x;\n"
1045     "MUL R0.z, R0, c[9].y;\n"
1046     "MAD R0.x, R0.y, R0.y, -R0.z;\n"
1047     "RSQ R0.x, R0.x;\n"
1048     "RCP R0.z, R0.x;\n"
1049     "ADD R1.x, -R0.y, R0.z;\n"
1050     "MOV R0.x, c[9];\n"
1051     "MUL R0.z, R0.x, c[1].x;\n"
1052     "RCP R1.y, R0.z;\n"
1053     "MUL R0.xy, fragment.position, c[6];\n"
1054     "TEX R0, R0, texture[0], 2D;\n"
1055     "MUL R1.x, R1, R1.y;\n"
1056     "TEX R1, R1, texture[2], 1D;\n"
1057     "ADD R2.x, -R0.w, c[9].z;\n"
1058     "MUL R2.xyz, R1, R2.x;\n"
1059     "MAD R1.xyz, R1, R0, R2;\n"
1060     "ADD R2.x, -R1.w, c[9].z;\n"
1061     "MAD R2.xyz, R0, R2.x, R1;\n"
1062     "ADD R1.z, R1.w, R0.w;\n"
1063     "MAD R2.w, -R1, R0, R1.z;\n"
1064     "ADD R1.xy, fragment.position, c[7];\n"
1065     "MUL R1.xy, R1, c[5];\n"
1066     "TEX R1, R1, texture[1], 2D;\n"
1067     "ADD R2, R2, -R0;\n"
1068     "DP4 R1.x, R1, c[8];\n"
1069     "MAD result.color, R1.x, R2, R0;\n"
1070     "END\n"
1071     ;
1072 
1073 static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_RADIAL_COMPOSITION_MODES_SCREEN =
1074     "!!ARBfp1.0\n"
1075     "PARAM c[10] = { program.local[0..8],\n"
1076     "		{ 2, 4 } };\n"
1077     "TEMP R0;\n"
1078     "TEMP R1;\n"
1079     "TEMP R2;\n"
1080     "TEMP R3;\n"
1081     "MUL R0.xyz, fragment.position.y, c[3];\n"
1082     "MAD R0.xyz, fragment.position.x, c[2], R0;\n"
1083     "ADD R0.xyz, R0, c[4];\n"
1084     "RCP R0.z, R0.z;\n"
1085     "MUL R0.xy, R0, R0.z;\n"
1086     "MUL R0.zw, R0.xyxy, R0.xyxy;\n"
1087     "ADD R0.z, R0, R0.w;\n"
1088     "MUL R0.xy, R0, c[0];\n"
1089     "ADD R0.x, R0, R0.y;\n"
1090     "MUL R0.y, R0.x, c[9].x;\n"
1091     "MOV R0.x, c[9];\n"
1092     "MUL R0.z, -R0, c[1].x;\n"
1093     "MUL R0.z, R0, c[9].y;\n"
1094     "MAD R0.z, R0.y, R0.y, -R0;\n"
1095     "ADD R3.xy, fragment.position, c[7];\n"
1096     "MUL R0.w, R0.x, c[1].x;\n"
1097     "RSQ R0.z, R0.z;\n"
1098     "RCP R0.x, R0.z;\n"
1099     "RCP R0.z, R0.w;\n"
1100     "ADD R0.x, -R0.y, R0;\n"
1101     "MUL R0.z, R0.x, R0;\n"
1102     "TEX R1, R0.z, texture[2], 1D;\n"
1103     "MUL R0.xy, fragment.position, c[6];\n"
1104     "TEX R0, R0, texture[0], 2D;\n"
1105     "ADD R2, R1, R0;\n"
1106     "MAD R2, -R1, R0, R2;\n"
1107     "MUL R3.xy, R3, c[5];\n"
1108     "TEX R1, R3, texture[1], 2D;\n"
1109     "ADD R2, R2, -R0;\n"
1110     "DP4 R1.x, R1, c[8];\n"
1111     "MAD result.color, R1.x, R2, R0;\n"
1112     "END\n"
1113     ;
1114 
1115 static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_RADIAL_COMPOSITION_MODES_OVERLAY =
1116     "!!ARBfp1.0\n"
1117     "PARAM c[10] = { program.local[0..8],\n"
1118     "		{ 2, 4, 1 } };\n"
1119     "TEMP R0;\n"
1120     "TEMP R1;\n"
1121     "TEMP R2;\n"
1122     "TEMP R3;\n"
1123     "TEMP R4;\n"
1124     "MUL R0.xyz, fragment.position.y, c[3];\n"
1125     "MAD R0.xyz, fragment.position.x, c[2], R0;\n"
1126     "ADD R0.xyz, R0, c[4];\n"
1127     "RCP R0.z, R0.z;\n"
1128     "MUL R0.xy, R0, R0.z;\n"
1129     "MUL R0.zw, R0.xyxy, R0.xyxy;\n"
1130     "ADD R0.z, R0, R0.w;\n"
1131     "MUL R0.xy, R0, c[0];\n"
1132     "ADD R0.x, R0, R0.y;\n"
1133     "MUL R0.y, R0.x, c[9].x;\n"
1134     "MOV R0.x, c[9];\n"
1135     "MUL R0.z, -R0, c[1].x;\n"
1136     "MUL R0.z, R0, c[9].y;\n"
1137     "MAD R0.z, R0.y, R0.y, -R0;\n"
1138     "MUL R1.xy, fragment.position, c[6];\n"
1139     "TEX R1, R1, texture[0], 2D;\n"
1140     "MUL R0.w, R0.x, c[1].x;\n"
1141     "RSQ R0.z, R0.z;\n"
1142     "RCP R0.x, R0.z;\n"
1143     "ADD R2.w, -R1, c[9].z;\n"
1144     "RCP R0.z, R0.w;\n"
1145     "ADD R0.x, -R0.y, R0;\n"
1146     "MUL R0.x, R0, R0.z;\n"
1147     "TEX R0, R0, texture[2], 1D;\n"
1148     "ADD R3.xyz, R0.w, -R0;\n"
1149     "ADD R2.xyz, R1.w, -R1;\n"
1150     "MUL R2.xyz, R2, R3;\n"
1151     "MUL R2.xyz, R2, c[9].x;\n"
1152     "MAD R2.xyz, R0.w, R1.w, -R2;\n"
1153     "MUL R4.xyz, R0, R2.w;\n"
1154     "MUL R3.xyz, R0, R1;\n"
1155     "MAD R0.xyz, R0, R2.w, R2;\n"
1156     "ADD R2.x, -R0.w, c[9].z;\n"
1157     "MAD R3.xyz, R3, c[9].x, R4;\n"
1158     "MAD R3.xyz, R1, R2.x, R3;\n"
1159     "MAD R0.xyz, R1, R2.x, R0;\n"
1160     "MUL R2.xyz, R1, c[9].x;\n"
1161     "ADD R0.xyz, R0, -R3;\n"
1162     "SGE R2.xyz, R2, R1.w;\n"
1163     "MAD R2.xyz, R2, R0, R3;\n"
1164     "ADD R0.z, R0.w, R1.w;\n"
1165     "MAD R2.w, -R0, R1, R0.z;\n"
1166     "ADD R0.xy, fragment.position, c[7];\n"
1167     "MUL R0.xy, R0, c[5];\n"
1168     "TEX R0, R0, texture[1], 2D;\n"
1169     "ADD R2, R2, -R1;\n"
1170     "DP4 R0.x, R0, c[8];\n"
1171     "MAD result.color, R0.x, R2, R1;\n"
1172     "END\n"
1173     ;
1174 
1175 static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_RADIAL_COMPOSITION_MODES_DARKEN =
1176     "!!ARBfp1.0\n"
1177     "PARAM c[10] = { program.local[0..8],\n"
1178     "		{ 2, 4, 1 } };\n"
1179     "TEMP R0;\n"
1180     "TEMP R1;\n"
1181     "TEMP R2;\n"
1182     "TEMP R3;\n"
1183     "MUL R0.xyz, fragment.position.y, c[3];\n"
1184     "MAD R0.xyz, fragment.position.x, c[2], R0;\n"
1185     "ADD R0.xyz, R0, c[4];\n"
1186     "RCP R0.z, R0.z;\n"
1187     "MUL R0.xy, R0, R0.z;\n"
1188     "MUL R0.zw, R0.xyxy, R0.xyxy;\n"
1189     "ADD R0.z, R0, R0.w;\n"
1190     "MUL R0.xy, R0, c[0];\n"
1191     "ADD R0.x, R0, R0.y;\n"
1192     "MUL R0.z, -R0, c[1].x;\n"
1193     "MUL R0.y, R0.x, c[9].x;\n"
1194     "MUL R0.z, R0, c[9].y;\n"
1195     "MAD R0.x, R0.y, R0.y, -R0.z;\n"
1196     "RSQ R0.z, R0.x;\n"
1197     "MOV R0.x, c[9];\n"
1198     "MUL R0.x, R0, c[1];\n"
1199     "RCP R0.z, R0.z;\n"
1200     "ADD R0.z, -R0.y, R0;\n"
1201     "RCP R0.w, R0.x;\n"
1202     "MUL R1.x, R0.z, R0.w;\n"
1203     "MUL R0.xy, fragment.position, c[6];\n"
1204     "TEX R0, R0, texture[0], 2D;\n"
1205     "TEX R1, R1, texture[2], 1D;\n"
1206     "MUL R3.xyz, R1.w, R0;\n"
1207     "MUL R2.xyz, R1, R0.w;\n"
1208     "MIN R2.xyz, R2, R3;\n"
1209     "ADD R2.w, -R0, c[9].z;\n"
1210     "MAD R1.xyz, R1, R2.w, R2;\n"
1211     "ADD R2.x, -R1.w, c[9].z;\n"
1212     "MAD R2.xyz, R0, R2.x, R1;\n"
1213     "ADD R1.z, R1.w, R0.w;\n"
1214     "MAD R2.w, -R1, R0, R1.z;\n"
1215     "ADD R1.xy, fragment.position, c[7];\n"
1216     "MUL R1.xy, R1, c[5];\n"
1217     "TEX R1, R1, texture[1], 2D;\n"
1218     "ADD R2, R2, -R0;\n"
1219     "DP4 R1.x, R1, c[8];\n"
1220     "MAD result.color, R1.x, R2, R0;\n"
1221     "END\n"
1222     ;
1223 
1224 static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_RADIAL_COMPOSITION_MODES_LIGHTEN =
1225     "!!ARBfp1.0\n"
1226     "PARAM c[10] = { program.local[0..8],\n"
1227     "		{ 2, 4, 1 } };\n"
1228     "TEMP R0;\n"
1229     "TEMP R1;\n"
1230     "TEMP R2;\n"
1231     "TEMP R3;\n"
1232     "MUL R0.xyz, fragment.position.y, c[3];\n"
1233     "MAD R0.xyz, fragment.position.x, c[2], R0;\n"
1234     "ADD R0.xyz, R0, c[4];\n"
1235     "RCP R0.z, R0.z;\n"
1236     "MUL R0.xy, R0, R0.z;\n"
1237     "MUL R0.zw, R0.xyxy, R0.xyxy;\n"
1238     "ADD R0.z, R0, R0.w;\n"
1239     "MUL R0.xy, R0, c[0];\n"
1240     "ADD R0.x, R0, R0.y;\n"
1241     "MUL R0.z, -R0, c[1].x;\n"
1242     "MUL R0.y, R0.x, c[9].x;\n"
1243     "MUL R0.z, R0, c[9].y;\n"
1244     "MAD R0.x, R0.y, R0.y, -R0.z;\n"
1245     "RSQ R0.z, R0.x;\n"
1246     "MOV R0.x, c[9];\n"
1247     "MUL R0.x, R0, c[1];\n"
1248     "RCP R0.z, R0.z;\n"
1249     "ADD R0.z, -R0.y, R0;\n"
1250     "RCP R0.w, R0.x;\n"
1251     "MUL R1.x, R0.z, R0.w;\n"
1252     "MUL R0.xy, fragment.position, c[6];\n"
1253     "TEX R0, R0, texture[0], 2D;\n"
1254     "TEX R1, R1, texture[2], 1D;\n"
1255     "MUL R3.xyz, R1.w, R0;\n"
1256     "MUL R2.xyz, R1, R0.w;\n"
1257     "MAX R2.xyz, R2, R3;\n"
1258     "ADD R2.w, -R0, c[9].z;\n"
1259     "MAD R1.xyz, R1, R2.w, R2;\n"
1260     "ADD R2.x, -R1.w, c[9].z;\n"
1261     "MAD R2.xyz, R0, R2.x, R1;\n"
1262     "ADD R1.z, R1.w, R0.w;\n"
1263     "MAD R2.w, -R1, R0, R1.z;\n"
1264     "ADD R1.xy, fragment.position, c[7];\n"
1265     "MUL R1.xy, R1, c[5];\n"
1266     "TEX R1, R1, texture[1], 2D;\n"
1267     "ADD R2, R2, -R0;\n"
1268     "DP4 R1.x, R1, c[8];\n"
1269     "MAD result.color, R1.x, R2, R0;\n"
1270     "END\n"
1271     ;
1272 
1273 static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_RADIAL_COMPOSITION_MODES_COLORDODGE =
1274     "!!ARBfp1.0\n"
1275     "PARAM c[10] = { program.local[0..8],\n"
1276     "		{ 2, 4, 1, 1e-006 } };\n"
1277     "TEMP R0;\n"
1278     "TEMP R1;\n"
1279     "TEMP R2;\n"
1280     "TEMP R3;\n"
1281     "TEMP R4;\n"
1282     "MUL R0.xyz, fragment.position.y, c[3];\n"
1283     "MAD R0.xyz, fragment.position.x, c[2], R0;\n"
1284     "ADD R0.xyz, R0, c[4];\n"
1285     "RCP R0.z, R0.z;\n"
1286     "MUL R0.xy, R0, R0.z;\n"
1287     "MUL R0.zw, R0.xyxy, R0.xyxy;\n"
1288     "ADD R0.z, R0, R0.w;\n"
1289     "MUL R0.xy, R0, c[0];\n"
1290     "ADD R0.x, R0, R0.y;\n"
1291     "MUL R0.y, R0.x, c[9].x;\n"
1292     "MOV R0.x, c[9];\n"
1293     "MUL R0.z, -R0, c[1].x;\n"
1294     "MUL R0.z, R0, c[9].y;\n"
1295     "MAD R0.z, R0.y, R0.y, -R0;\n"
1296     "MUL R0.w, R0.x, c[1].x;\n"
1297     "RSQ R0.z, R0.z;\n"
1298     "RCP R0.x, R0.z;\n"
1299     "RCP R0.z, R0.w;\n"
1300     "ADD R0.x, -R0.y, R0;\n"
1301     "MUL R0.x, R0, R0.z;\n"
1302     "TEX R0, R0, texture[2], 1D;\n"
1303     "MAX R1.x, R0.w, c[9].w;\n"
1304     "RCP R1.x, R1.x;\n"
1305     "MAD R1.xyz, -R0, R1.x, c[9].z;\n"
1306     "MAX R2.xyz, R1, c[9].w;\n"
1307     "MUL R1.xy, fragment.position, c[6];\n"
1308     "TEX R1, R1, texture[0], 2D;\n"
1309     "ADD R2.w, -R0, c[9].z;\n"
1310     "MUL R3.xyz, R1, R2.w;\n"
1311     "ADD R2.w, -R1, c[9].z;\n"
1312     "MAD R4.xyz, R0, R2.w, R3;\n"
1313     "MUL R3.xyz, R0.w, R1;\n"
1314     "MUL R2.w, R0, R1;\n"
1315     "MAD R0.xyz, R0, R1.w, R3;\n"
1316     "SGE R0.xyz, R0, R2.w;\n"
1317     "RCP R2.x, R2.x;\n"
1318     "RCP R2.y, R2.y;\n"
1319     "RCP R2.z, R2.z;\n"
1320     "MAD R2.xyz, R3, R2, R4;\n"
1321     "MAD R4.xyz, R0.w, R1.w, R4;\n"
1322     "ADD R4.xyz, R4, -R2;\n"
1323     "MAD R2.xyz, R0, R4, R2;\n"
1324     "ADD R0.z, R0.w, R1.w;\n"
1325     "MAD R2.w, -R0, R1, R0.z;\n"
1326     "ADD R0.xy, fragment.position, c[7];\n"
1327     "MUL R0.xy, R0, c[5];\n"
1328     "TEX R0, R0, texture[1], 2D;\n"
1329     "ADD R2, R2, -R1;\n"
1330     "DP4 R0.x, R0, c[8];\n"
1331     "MAD result.color, R0.x, R2, R1;\n"
1332     "END\n"
1333     ;
1334 
1335 static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_RADIAL_COMPOSITION_MODES_COLORBURN =
1336     "!!ARBfp1.0\n"
1337     "PARAM c[10] = { program.local[0..8],\n"
1338     "		{ 2, 4, 1, 9.9999997e-006 } };\n"
1339     "TEMP R0;\n"
1340     "TEMP R1;\n"
1341     "TEMP R2;\n"
1342     "TEMP R3;\n"
1343     "TEMP R4;\n"
1344     "TEMP R5;\n"
1345     "MUL R0.xyz, fragment.position.y, c[3];\n"
1346     "MAD R0.xyz, fragment.position.x, c[2], R0;\n"
1347     "ADD R0.xyz, R0, c[4];\n"
1348     "RCP R0.z, R0.z;\n"
1349     "MUL R0.xy, R0, R0.z;\n"
1350     "MUL R0.zw, R0.xyxy, R0.xyxy;\n"
1351     "ADD R0.z, R0, R0.w;\n"
1352     "MUL R0.xy, R0, c[0];\n"
1353     "ADD R0.x, R0, R0.y;\n"
1354     "MUL R0.z, -R0, c[1].x;\n"
1355     "MUL R0.y, R0.x, c[9].x;\n"
1356     "MUL R0.z, R0, c[9].y;\n"
1357     "MAD R0.x, R0.y, R0.y, -R0.z;\n"
1358     "RSQ R0.z, R0.x;\n"
1359     "MOV R0.x, c[9];\n"
1360     "MUL R0.w, R0.x, c[1].x;\n"
1361     "RCP R0.z, R0.z;\n"
1362     "ADD R0.x, -R0.y, R0.z;\n"
1363     "RCP R0.y, R0.w;\n"
1364     "MUL R0.zw, fragment.position.xyxy, c[6].xyxy;\n"
1365     "TEX R1, R0.zwzw, texture[0], 2D;\n"
1366     "MUL R0.x, R0, R0.y;\n"
1367     "TEX R0, R0, texture[2], 1D;\n"
1368     "MUL R2.xyz, R0.w, R1;\n"
1369     "MAD R3.xyz, R0, R1.w, R2;\n"
1370     "MAD R2.xyz, -R0.w, R1.w, R3;\n"
1371     "MUL R4.xyz, R0.w, R2;\n"
1372     "MAX R2.xyz, R0, c[9].w;\n"
1373     "ADD R2.w, -R1, c[9].z;\n"
1374     "MUL R5.xyz, R0, R2.w;\n"
1375     "ADD R3.w, -R0, c[9].z;\n"
1376     "RCP R2.x, R2.x;\n"
1377     "RCP R2.y, R2.y;\n"
1378     "RCP R2.z, R2.z;\n"
1379     "MAD R2.xyz, R4, R2, R5;\n"
1380     "MUL R4.xyz, R1, R3.w;\n"
1381     "MAD R0.xyz, R0, R2.w, R4;\n"
1382     "MUL R2.w, R0, R1;\n"
1383     "MAD R2.xyz, R1, R3.w, R2;\n"
1384     "ADD R2.xyz, R2, -R0;\n"
1385     "SGE R3.xyz, R3, R2.w;\n"
1386     "MAD R2.xyz, R3, R2, R0;\n"
1387     "ADD R0.z, R0.w, R1.w;\n"
1388     "MAD R2.w, -R0, R1, R0.z;\n"
1389     "ADD R0.xy, fragment.position, c[7];\n"
1390     "MUL R0.xy, R0, c[5];\n"
1391     "TEX R0, R0, texture[1], 2D;\n"
1392     "ADD R2, R2, -R1;\n"
1393     "DP4 R0.x, R0, c[8];\n"
1394     "MAD result.color, R0.x, R2, R1;\n"
1395     "END\n"
1396     ;
1397 
1398 static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_RADIAL_COMPOSITION_MODES_HARDLIGHT =
1399     "!!ARBfp1.0\n"
1400     "PARAM c[10] = { program.local[0..8],\n"
1401     "		{ 2, 4, 1 } };\n"
1402     "TEMP R0;\n"
1403     "TEMP R1;\n"
1404     "TEMP R2;\n"
1405     "TEMP R3;\n"
1406     "TEMP R4;\n"
1407     "MUL R0.xyz, fragment.position.y, c[3];\n"
1408     "MAD R0.xyz, fragment.position.x, c[2], R0;\n"
1409     "ADD R0.xyz, R0, c[4];\n"
1410     "RCP R0.z, R0.z;\n"
1411     "MUL R0.xy, R0, R0.z;\n"
1412     "MUL R0.zw, R0.xyxy, R0.xyxy;\n"
1413     "ADD R0.z, R0, R0.w;\n"
1414     "MUL R0.xy, R0, c[0];\n"
1415     "ADD R0.x, R0, R0.y;\n"
1416     "MUL R0.y, R0.x, c[9].x;\n"
1417     "MOV R0.x, c[9];\n"
1418     "MUL R0.z, -R0, c[1].x;\n"
1419     "MUL R0.z, R0, c[9].y;\n"
1420     "MAD R0.z, R0.y, R0.y, -R0;\n"
1421     "MUL R1.xy, fragment.position, c[6];\n"
1422     "TEX R1, R1, texture[0], 2D;\n"
1423     "MUL R0.w, R0.x, c[1].x;\n"
1424     "RSQ R0.z, R0.z;\n"
1425     "RCP R0.x, R0.z;\n"
1426     "ADD R2.w, -R1, c[9].z;\n"
1427     "RCP R0.z, R0.w;\n"
1428     "ADD R0.x, -R0.y, R0;\n"
1429     "MUL R0.x, R0, R0.z;\n"
1430     "TEX R0, R0, texture[2], 1D;\n"
1431     "ADD R3.xyz, R0.w, -R0;\n"
1432     "ADD R2.xyz, R1.w, -R1;\n"
1433     "MUL R2.xyz, R2, R3;\n"
1434     "MUL R2.xyz, R2, c[9].x;\n"
1435     "MAD R2.xyz, R0.w, R1.w, -R2;\n"
1436     "MUL R4.xyz, R0, R2.w;\n"
1437     "MAD R2.xyz, R0, R2.w, R2;\n"
1438     "MUL R3.xyz, R0, R1;\n"
1439     "ADD R2.w, -R0, c[9].z;\n"
1440     "MAD R3.xyz, R3, c[9].x, R4;\n"
1441     "MUL R0.xyz, R0, c[9].x;\n"
1442     "SGE R0.xyz, R0, R0.w;\n"
1443     "MAD R3.xyz, R1, R2.w, R3;\n"
1444     "MAD R2.xyz, R1, R2.w, R2;\n"
1445     "ADD R2.xyz, R2, -R3;\n"
1446     "MAD R2.xyz, R0, R2, R3;\n"
1447     "ADD R0.z, R0.w, R1.w;\n"
1448     "MAD R2.w, -R0, R1, R0.z;\n"
1449     "ADD R0.xy, fragment.position, c[7];\n"
1450     "MUL R0.xy, R0, c[5];\n"
1451     "TEX R0, R0, texture[1], 2D;\n"
1452     "ADD R2, R2, -R1;\n"
1453     "DP4 R0.x, R0, c[8];\n"
1454     "MAD result.color, R0.x, R2, R1;\n"
1455     "END\n"
1456     ;
1457 
1458 static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_RADIAL_COMPOSITION_MODES_SOFTLIGHT =
1459     "!!ARBfp1.0\n"
1460     "PARAM c[11] = { program.local[0..8],\n"
1461     "		{ 2, 4, 1, 9.9999997e-006 },\n"
1462     "		{ 16, 12, 3 } };\n"
1463     "TEMP R0;\n"
1464     "TEMP R1;\n"
1465     "TEMP R2;\n"
1466     "TEMP R3;\n"
1467     "TEMP R4;\n"
1468     "TEMP R5;\n"
1469     "TEMP R6;\n"
1470     "MUL R0.xyz, fragment.position.y, c[3];\n"
1471     "MAD R0.xyz, fragment.position.x, c[2], R0;\n"
1472     "ADD R0.xyz, R0, c[4];\n"
1473     "RCP R0.z, R0.z;\n"
1474     "MUL R0.xy, R0, R0.z;\n"
1475     "MUL R0.zw, R0.xyxy, R0.xyxy;\n"
1476     "ADD R0.z, R0, R0.w;\n"
1477     "MUL R0.xy, R0, c[0];\n"
1478     "ADD R0.x, R0, R0.y;\n"
1479     "MUL R0.z, -R0, c[1].x;\n"
1480     "MUL R0.y, R0.z, c[9];\n"
1481     "MUL R0.x, R0, c[9];\n"
1482     "MUL R0.zw, fragment.position.xyxy, c[6].xyxy;\n"
1483     "TEX R1, R0.zwzw, texture[0], 2D;\n"
1484     "MAD R0.y, R0.x, R0.x, -R0;\n"
1485     "RSQ R0.y, R0.y;\n"
1486     "RCP R0.y, R0.y;\n"
1487     "ADD R0.y, -R0.x, R0;\n"
1488     "MOV R0.x, c[9];\n"
1489     "MUL R0.x, R0, c[1];\n"
1490     "MAX R0.z, R1.w, c[9].w;\n"
1491     "RCP R0.z, R0.z;\n"
1492     "MUL R3.xyz, R1, R0.z;\n"
1493     "MAD R4.xyz, R3, c[10].x, -c[10].y;\n"
1494     "RCP R0.x, R0.x;\n"
1495     "MUL R0.x, R0.y, R0;\n"
1496     "TEX R0, R0, texture[2], 1D;\n"
1497     "MAD R2.xyz, R0, c[9].x, -R0.w;\n"
1498     "MAD R4.xyz, R3, R4, c[10].z;\n"
1499     "MUL R5.xyz, R1.w, R2;\n"
1500     "MUL R6.xyz, R5, R4;\n"
1501     "RSQ R2.w, R3.x;\n"
1502     "RCP R4.x, R2.w;\n"
1503     "RSQ R2.w, R3.y;\n"
1504     "RSQ R3.w, R3.z;\n"
1505     "RCP R4.y, R2.w;\n"
1506     "RCP R4.z, R3.w;\n"
1507     "ADD R4.xyz, -R3, R4;\n"
1508     "MUL R6.xyz, R3, R6;\n"
1509     "MUL R4.xyz, R5, R4;\n"
1510     "ADD R3.xyz, -R3, c[9].z;\n"
1511     "MAD R2.xyz, R2, R3, R0.w;\n"
1512     "MUL R3.xyz, R0, c[9].x;\n"
1513     "MAD R5.xyz, R0.w, R1, R6;\n"
1514     "MAD R4.xyz, R0.w, R1, R4;\n"
1515     "ADD R6.xyz, R4, -R5;\n"
1516     "MUL R4.xyz, R1, c[9].y;\n"
1517     "SGE R4.xyz, R4, R1.w;\n"
1518     "MAD R4.xyz, R4, R6, R5;\n"
1519     "MAD R4.xyz, -R1, R2, R4;\n"
1520     "SGE R3.xyz, R3, R0.w;\n"
1521     "MUL R2.xyz, R1, R2;\n"
1522     "ADD R2.w, -R1, c[9].z;\n"
1523     "MAD R2.xyz, R3, R4, R2;\n"
1524     "MAD R2.xyz, R0, R2.w, R2;\n"
1525     "ADD R0.x, -R0.w, c[9].z;\n"
1526     "MAD R2.xyz, R1, R0.x, R2;\n"
1527     "ADD R0.z, R0.w, R1.w;\n"
1528     "MAD R2.w, -R0, R1, R0.z;\n"
1529     "ADD R0.xy, fragment.position, c[7];\n"
1530     "MUL R0.xy, R0, c[5];\n"
1531     "TEX R0, R0, texture[1], 2D;\n"
1532     "ADD R2, R2, -R1;\n"
1533     "DP4 R0.x, R0, c[8];\n"
1534     "MAD result.color, R0.x, R2, R1;\n"
1535     "END\n"
1536     ;
1537 
1538 static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_RADIAL_COMPOSITION_MODES_DIFFERENCE =
1539     "!!ARBfp1.0\n"
1540     "PARAM c[10] = { program.local[0..8],\n"
1541     "		{ 2, 4 } };\n"
1542     "TEMP R0;\n"
1543     "TEMP R1;\n"
1544     "TEMP R2;\n"
1545     "TEMP R3;\n"
1546     "MUL R0.xyz, fragment.position.y, c[3];\n"
1547     "MAD R0.xyz, fragment.position.x, c[2], R0;\n"
1548     "ADD R0.xyz, R0, c[4];\n"
1549     "RCP R0.z, R0.z;\n"
1550     "MUL R0.xy, R0, R0.z;\n"
1551     "MUL R0.zw, R0.xyxy, R0.xyxy;\n"
1552     "ADD R0.z, R0, R0.w;\n"
1553     "MUL R0.xy, R0, c[0];\n"
1554     "ADD R0.x, R0, R0.y;\n"
1555     "MUL R0.z, -R0, c[1].x;\n"
1556     "MUL R0.y, R0.x, c[9].x;\n"
1557     "MUL R0.z, R0, c[9].y;\n"
1558     "MAD R0.x, R0.y, R0.y, -R0.z;\n"
1559     "RSQ R0.z, R0.x;\n"
1560     "MOV R0.x, c[9];\n"
1561     "MUL R0.x, R0, c[1];\n"
1562     "RCP R0.z, R0.z;\n"
1563     "ADD R0.z, -R0.y, R0;\n"
1564     "RCP R0.w, R0.x;\n"
1565     "MUL R1.x, R0.z, R0.w;\n"
1566     "MUL R0.xy, fragment.position, c[6];\n"
1567     "TEX R0, R0, texture[0], 2D;\n"
1568     "TEX R1, R1, texture[2], 1D;\n"
1569     "ADD R2.xyz, R1, R0;\n"
1570     "MUL R3.xyz, R1.w, R0;\n"
1571     "MUL R1.xyz, R1, R0.w;\n"
1572     "MIN R1.xyz, R1, R3;\n"
1573     "MAD R2.xyz, -R1, c[9].x, R2;\n"
1574     "ADD R1.z, R1.w, R0.w;\n"
1575     "MAD R2.w, -R1, R0, R1.z;\n"
1576     "ADD R1.xy, fragment.position, c[7];\n"
1577     "MUL R1.xy, R1, c[5];\n"
1578     "TEX R1, R1, texture[1], 2D;\n"
1579     "ADD R2, R2, -R0;\n"
1580     "DP4 R1.x, R1, c[8];\n"
1581     "MAD result.color, R1.x, R2, R0;\n"
1582     "END\n"
1583     ;
1584 
1585 static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_RADIAL_COMPOSITION_MODES_EXCLUSION =
1586     "!!ARBfp1.0\n"
1587     "PARAM c[10] = { program.local[0..8],\n"
1588     "		{ 2, 4, 1 } };\n"
1589     "TEMP R0;\n"
1590     "TEMP R1;\n"
1591     "TEMP R2;\n"
1592     "TEMP R3;\n"
1593     "MUL R0.xyz, fragment.position.y, c[3];\n"
1594     "MAD R0.xyz, fragment.position.x, c[2], R0;\n"
1595     "ADD R0.xyz, R0, c[4];\n"
1596     "RCP R0.z, R0.z;\n"
1597     "MUL R0.xy, R0, R0.z;\n"
1598     "MUL R0.zw, R0.xyxy, R0.xyxy;\n"
1599     "ADD R0.z, R0, R0.w;\n"
1600     "MUL R0.xy, R0, c[0];\n"
1601     "ADD R0.x, R0, R0.y;\n"
1602     "MUL R0.z, -R0, c[1].x;\n"
1603     "MUL R0.y, R0.x, c[9].x;\n"
1604     "MUL R0.z, R0, c[9].y;\n"
1605     "MAD R0.x, R0.y, R0.y, -R0.z;\n"
1606     "RSQ R0.z, R0.x;\n"
1607     "MOV R0.x, c[9];\n"
1608     "MUL R0.x, R0, c[1];\n"
1609     "RCP R0.z, R0.z;\n"
1610     "ADD R0.z, -R0.y, R0;\n"
1611     "RCP R0.w, R0.x;\n"
1612     "MUL R1.x, R0.z, R0.w;\n"
1613     "MUL R0.xy, fragment.position, c[6];\n"
1614     "TEX R0, R0, texture[0], 2D;\n"
1615     "TEX R1, R1, texture[2], 1D;\n"
1616     "MUL R2.xyz, R1.w, R0;\n"
1617     "MAD R3.xyz, R1, R0.w, R2;\n"
1618     "MUL R2.xyz, R1, R0;\n"
1619     "MAD R2.xyz, -R2, c[9].x, R3;\n"
1620     "ADD R2.w, -R0, c[9].z;\n"
1621     "MAD R1.xyz, R1, R2.w, R2;\n"
1622     "ADD R2.x, -R1.w, c[9].z;\n"
1623     "MAD R2.xyz, R0, R2.x, R1;\n"
1624     "ADD R1.z, R1.w, R0.w;\n"
1625     "MAD R2.w, -R1, R0, R1.z;\n"
1626     "ADD R1.xy, fragment.position, c[7];\n"
1627     "MUL R1.xy, R1, c[5];\n"
1628     "TEX R1, R1, texture[1], 2D;\n"
1629     "ADD R2, R2, -R0;\n"
1630     "DP4 R1.x, R1, c[8];\n"
1631     "MAD result.color, R1.x, R2, R0;\n"
1632     "END\n"
1633     ;
1634 
1635 static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_RADIAL_COMPOSITION_MODES_SIMPLE_PORTER_DUFF_NOMASK =
1636     "!!ARBfp1.0\n"
1637     "PARAM c[9] = { program.local[0..7],\n"
1638     "		{ 2, 4, 1 } };\n"
1639     "TEMP R0;\n"
1640     "TEMP R1;\n"
1641     "TEMP R2;\n"
1642     "TEMP R3;\n"
1643     "MUL R0.xyz, fragment.position.y, c[3];\n"
1644     "MAD R0.xyz, fragment.position.x, c[2], R0;\n"
1645     "ADD R0.xyz, R0, c[4];\n"
1646     "RCP R0.z, R0.z;\n"
1647     "MUL R0.xy, R0, R0.z;\n"
1648     "MUL R0.zw, R0.xyxy, R0.xyxy;\n"
1649     "ADD R0.z, R0, R0.w;\n"
1650     "MUL R0.xy, R0, c[0];\n"
1651     "ADD R0.x, R0, R0.y;\n"
1652     "MUL R0.z, -R0, c[1].x;\n"
1653     "MUL R0.y, R0.x, c[8].x;\n"
1654     "MUL R0.z, R0, c[8].y;\n"
1655     "MAD R0.x, R0.y, R0.y, -R0.z;\n"
1656     "RSQ R0.x, R0.x;\n"
1657     "RCP R0.z, R0.x;\n"
1658     "ADD R0.y, -R0, R0.z;\n"
1659     "MUL R0.zw, fragment.position.xyxy, c[7].xyxy;\n"
1660     "TEX R1, R0.zwzw, texture[0], 2D;\n"
1661     "MUL R2.xyz, R1, c[5].y;\n"
1662     "MOV R0.x, c[8];\n"
1663     "MUL R0.x, R0, c[1];\n"
1664     "RCP R0.x, R0.x;\n"
1665     "MUL R0.x, R0.y, R0;\n"
1666     "TEX R0, R0, texture[1], 1D;\n"
1667     "MUL R3.xyz, R0.w, R2;\n"
1668     "MUL R2.xyz, R0, c[5].x;\n"
1669     "MAD R2.xyz, R1.w, R2, R3;\n"
1670     "ADD R2.w, -R1, c[8].z;\n"
1671     "MUL R0.xyz, R0, c[6].y;\n"
1672     "MAD R0.xyz, R2.w, R0, R2;\n"
1673     "ADD R2.x, -R0.w, c[8].z;\n"
1674     "MUL R1.xyz, R1, c[6].z;\n"
1675     "MAD result.color.xyz, R2.x, R1, R0;\n"
1676     "MUL R0.x, R0.w, R1.w;\n"
1677     "MUL R0.z, R1.w, R2.x;\n"
1678     "MUL R0.y, R0.w, R2.w;\n"
1679     "DP3 result.color.w, R0, c[6];\n"
1680     "END\n"
1681     ;
1682 
1683 static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_RADIAL_COMPOSITION_MODES_MULTIPLY_NOMASK =
1684     "!!ARBfp1.0\n"
1685     "PARAM c[7] = { program.local[0..5],\n"
1686     "		{ 2, 4, 1 } };\n"
1687     "TEMP R0;\n"
1688     "TEMP R1;\n"
1689     "TEMP R2;\n"
1690     "MUL R0.xyz, fragment.position.y, c[3];\n"
1691     "MAD R0.xyz, fragment.position.x, c[2], R0;\n"
1692     "ADD R0.xyz, R0, c[4];\n"
1693     "RCP R0.z, R0.z;\n"
1694     "MUL R0.xy, R0, R0.z;\n"
1695     "MUL R0.zw, R0.xyxy, R0.xyxy;\n"
1696     "ADD R0.z, R0, R0.w;\n"
1697     "MUL R0.xy, R0, c[0];\n"
1698     "ADD R0.x, R0, R0.y;\n"
1699     "MUL R0.z, -R0, c[1].x;\n"
1700     "MUL R0.y, R0.x, c[6].x;\n"
1701     "MUL R0.z, R0, c[6].y;\n"
1702     "MAD R0.x, R0.y, R0.y, -R0.z;\n"
1703     "RSQ R0.x, R0.x;\n"
1704     "RCP R0.z, R0.x;\n"
1705     "ADD R0.y, -R0, R0.z;\n"
1706     "MUL R0.zw, fragment.position.xyxy, c[5].xyxy;\n"
1707     "TEX R1, R0.zwzw, texture[0], 2D;\n"
1708     "MOV R0.x, c[6];\n"
1709     "MUL R0.x, R0, c[1];\n"
1710     "RCP R0.x, R0.x;\n"
1711     "MUL R0.x, R0.y, R0;\n"
1712     "TEX R0, R0, texture[1], 1D;\n"
1713     "ADD R2.x, -R1.w, c[6].z;\n"
1714     "MUL R2.xyz, R0, R2.x;\n"
1715     "MAD R0.xyz, R0, R1, R2;\n"
1716     "ADD R2.x, R0.w, R1.w;\n"
1717     "ADD R2.y, -R0.w, c[6].z;\n"
1718     "MAD result.color.xyz, R1, R2.y, R0;\n"
1719     "MAD result.color.w, -R0, R1, R2.x;\n"
1720     "END\n"
1721     ;
1722 
1723 static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_RADIAL_COMPOSITION_MODES_SCREEN_NOMASK =
1724     "!!ARBfp1.0\n"
1725     "PARAM c[7] = { program.local[0..5],\n"
1726     "		{ 2, 4 } };\n"
1727     "TEMP R0;\n"
1728     "TEMP R1;\n"
1729     "TEMP R2;\n"
1730     "MUL R0.xyz, fragment.position.y, c[3];\n"
1731     "MAD R0.xyz, fragment.position.x, c[2], R0;\n"
1732     "ADD R0.xyz, R0, c[4];\n"
1733     "RCP R0.z, R0.z;\n"
1734     "MUL R0.xy, R0, R0.z;\n"
1735     "MUL R0.zw, R0.xyxy, R0.xyxy;\n"
1736     "ADD R0.z, R0, R0.w;\n"
1737     "MUL R0.xy, R0, c[0];\n"
1738     "ADD R0.x, R0, R0.y;\n"
1739     "MUL R0.z, -R0, c[1].x;\n"
1740     "MUL R0.y, R0.x, c[6].x;\n"
1741     "MUL R0.z, R0, c[6].y;\n"
1742     "MAD R0.x, R0.y, R0.y, -R0.z;\n"
1743     "RSQ R0.z, R0.x;\n"
1744     "MOV R0.x, c[6];\n"
1745     "MUL R0.w, R0.x, c[1].x;\n"
1746     "RCP R0.z, R0.z;\n"
1747     "ADD R0.x, -R0.y, R0.z;\n"
1748     "RCP R0.y, R0.w;\n"
1749     "MUL R0.zw, fragment.position.xyxy, c[5].xyxy;\n"
1750     "TEX R1, R0.zwzw, texture[0], 2D;\n"
1751     "MUL R0.x, R0, R0.y;\n"
1752     "TEX R0, R0, texture[1], 1D;\n"
1753     "ADD R2, R0, R1;\n"
1754     "MAD result.color, -R0, R1, R2;\n"
1755     "END\n"
1756     ;
1757 
1758 static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_RADIAL_COMPOSITION_MODES_OVERLAY_NOMASK =
1759     "!!ARBfp1.0\n"
1760     "PARAM c[7] = { program.local[0..5],\n"
1761     "		{ 2, 4, 1 } };\n"
1762     "TEMP R0;\n"
1763     "TEMP R1;\n"
1764     "TEMP R2;\n"
1765     "TEMP R3;\n"
1766     "MUL R0.xyz, fragment.position.y, c[3];\n"
1767     "MAD R0.xyz, fragment.position.x, c[2], R0;\n"
1768     "ADD R0.xyz, R0, c[4];\n"
1769     "RCP R0.z, R0.z;\n"
1770     "MUL R0.xy, R0, R0.z;\n"
1771     "MUL R0.zw, R0.xyxy, R0.xyxy;\n"
1772     "ADD R0.z, R0, R0.w;\n"
1773     "MUL R0.xy, R0, c[0];\n"
1774     "ADD R0.x, R0, R0.y;\n"
1775     "MUL R0.y, R0.x, c[6].x;\n"
1776     "MOV R0.x, c[6];\n"
1777     "MUL R0.z, -R0, c[1].x;\n"
1778     "MUL R0.z, R0, c[6].y;\n"
1779     "MAD R0.z, R0.y, R0.y, -R0;\n"
1780     "MUL R1.xy, fragment.position, c[5];\n"
1781     "TEX R1, R1, texture[0], 2D;\n"
1782     "MUL R0.w, R0.x, c[1].x;\n"
1783     "RSQ R0.z, R0.z;\n"
1784     "RCP R0.x, R0.z;\n"
1785     "ADD R2.w, -R1, c[6].z;\n"
1786     "RCP R0.z, R0.w;\n"
1787     "ADD R0.x, -R0.y, R0;\n"
1788     "MUL R0.x, R0, R0.z;\n"
1789     "TEX R0, R0, texture[1], 1D;\n"
1790     "ADD R3.xyz, R0.w, -R0;\n"
1791     "ADD R2.xyz, R1.w, -R1;\n"
1792     "MUL R2.xyz, R2, R3;\n"
1793     "MUL R2.xyz, R2, c[6].x;\n"
1794     "MAD R2.xyz, R0.w, R1.w, -R2;\n"
1795     "MAD R2.xyz, R0, R2.w, R2;\n"
1796     "MUL R3.xyz, R0, R2.w;\n"
1797     "MUL R0.xyz, R0, R1;\n"
1798     "ADD R2.w, -R0, c[6].z;\n"
1799     "MAD R0.xyz, R0, c[6].x, R3;\n"
1800     "MAD R0.xyz, R1, R2.w, R0;\n"
1801     "MAD R2.xyz, R1, R2.w, R2;\n"
1802     "MUL R1.xyz, R1, c[6].x;\n"
1803     "ADD R2.w, R0, R1;\n"
1804     "ADD R2.xyz, R2, -R0;\n"
1805     "SGE R1.xyz, R1, R1.w;\n"
1806     "MAD result.color.xyz, R1, R2, R0;\n"
1807     "MAD result.color.w, -R0, R1, R2;\n"
1808     "END\n"
1809     ;
1810 
1811 static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_RADIAL_COMPOSITION_MODES_DARKEN_NOMASK =
1812     "!!ARBfp1.0\n"
1813     "PARAM c[7] = { program.local[0..5],\n"
1814     "		{ 2, 4, 1 } };\n"
1815     "TEMP R0;\n"
1816     "TEMP R1;\n"
1817     "TEMP R2;\n"
1818     "TEMP R3;\n"
1819     "MUL R0.xyz, fragment.position.y, c[3];\n"
1820     "MAD R0.xyz, fragment.position.x, c[2], R0;\n"
1821     "ADD R0.xyz, R0, c[4];\n"
1822     "RCP R0.z, R0.z;\n"
1823     "MUL R0.xy, R0, R0.z;\n"
1824     "MUL R0.zw, R0.xyxy, R0.xyxy;\n"
1825     "ADD R0.z, R0, R0.w;\n"
1826     "MUL R0.xy, R0, c[0];\n"
1827     "ADD R0.x, R0, R0.y;\n"
1828     "MUL R0.z, -R0, c[1].x;\n"
1829     "MUL R0.y, R0.x, c[6].x;\n"
1830     "MUL R0.z, R0, c[6].y;\n"
1831     "MAD R0.x, R0.y, R0.y, -R0.z;\n"
1832     "RSQ R0.z, R0.x;\n"
1833     "MOV R0.x, c[6];\n"
1834     "MUL R0.w, R0.x, c[1].x;\n"
1835     "RCP R0.z, R0.z;\n"
1836     "ADD R0.x, -R0.y, R0.z;\n"
1837     "RCP R0.y, R0.w;\n"
1838     "MUL R0.zw, fragment.position.xyxy, c[5].xyxy;\n"
1839     "TEX R1, R0.zwzw, texture[0], 2D;\n"
1840     "MUL R0.x, R0, R0.y;\n"
1841     "TEX R0, R0, texture[1], 1D;\n"
1842     "MUL R2.xyz, R0, R1.w;\n"
1843     "MUL R3.xyz, R0.w, R1;\n"
1844     "MIN R2.xyz, R2, R3;\n"
1845     "ADD R2.w, -R1, c[6].z;\n"
1846     "MAD R0.xyz, R0, R2.w, R2;\n"
1847     "ADD R2.x, R0.w, R1.w;\n"
1848     "ADD R2.y, -R0.w, c[6].z;\n"
1849     "MAD result.color.xyz, R1, R2.y, R0;\n"
1850     "MAD result.color.w, -R0, R1, R2.x;\n"
1851     "END\n"
1852     ;
1853 
1854 static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_RADIAL_COMPOSITION_MODES_LIGHTEN_NOMASK =
1855     "!!ARBfp1.0\n"
1856     "PARAM c[7] = { program.local[0..5],\n"
1857     "		{ 2, 4, 1 } };\n"
1858     "TEMP R0;\n"
1859     "TEMP R1;\n"
1860     "TEMP R2;\n"
1861     "TEMP R3;\n"
1862     "MUL R0.xyz, fragment.position.y, c[3];\n"
1863     "MAD R0.xyz, fragment.position.x, c[2], R0;\n"
1864     "ADD R0.xyz, R0, c[4];\n"
1865     "RCP R0.z, R0.z;\n"
1866     "MUL R0.xy, R0, R0.z;\n"
1867     "MUL R0.zw, R0.xyxy, R0.xyxy;\n"
1868     "ADD R0.z, R0, R0.w;\n"
1869     "MUL R0.xy, R0, c[0];\n"
1870     "ADD R0.x, R0, R0.y;\n"
1871     "MUL R0.z, -R0, c[1].x;\n"
1872     "MUL R0.y, R0.x, c[6].x;\n"
1873     "MUL R0.z, R0, c[6].y;\n"
1874     "MAD R0.x, R0.y, R0.y, -R0.z;\n"
1875     "RSQ R0.z, R0.x;\n"
1876     "MOV R0.x, c[6];\n"
1877     "MUL R0.w, R0.x, c[1].x;\n"
1878     "RCP R0.z, R0.z;\n"
1879     "ADD R0.x, -R0.y, R0.z;\n"
1880     "RCP R0.y, R0.w;\n"
1881     "MUL R0.zw, fragment.position.xyxy, c[5].xyxy;\n"
1882     "TEX R1, R0.zwzw, texture[0], 2D;\n"
1883     "MUL R0.x, R0, R0.y;\n"
1884     "TEX R0, R0, texture[1], 1D;\n"
1885     "MUL R2.xyz, R0, R1.w;\n"
1886     "MUL R3.xyz, R0.w, R1;\n"
1887     "MAX R2.xyz, R2, R3;\n"
1888     "ADD R2.w, -R1, c[6].z;\n"
1889     "MAD R0.xyz, R0, R2.w, R2;\n"
1890     "ADD R2.x, R0.w, R1.w;\n"
1891     "ADD R2.y, -R0.w, c[6].z;\n"
1892     "MAD result.color.xyz, R1, R2.y, R0;\n"
1893     "MAD result.color.w, -R0, R1, R2.x;\n"
1894     "END\n"
1895     ;
1896 
1897 static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_RADIAL_COMPOSITION_MODES_COLORDODGE_NOMASK =
1898     "!!ARBfp1.0\n"
1899     "PARAM c[7] = { program.local[0..5],\n"
1900     "		{ 2, 4, 1, 1e-006 } };\n"
1901     "TEMP R0;\n"
1902     "TEMP R1;\n"
1903     "TEMP R2;\n"
1904     "TEMP R3;\n"
1905     "MUL R0.xyz, fragment.position.y, c[3];\n"
1906     "MAD R0.xyz, fragment.position.x, c[2], R0;\n"
1907     "ADD R0.xyz, R0, c[4];\n"
1908     "RCP R0.z, R0.z;\n"
1909     "MUL R0.xy, R0, R0.z;\n"
1910     "MUL R0.zw, R0.xyxy, R0.xyxy;\n"
1911     "ADD R0.z, R0, R0.w;\n"
1912     "MUL R0.xy, R0, c[0];\n"
1913     "ADD R0.x, R0, R0.y;\n"
1914     "MUL R0.y, R0.x, c[6].x;\n"
1915     "MOV R0.x, c[6];\n"
1916     "MUL R0.z, -R0, c[1].x;\n"
1917     "MUL R0.z, R0, c[6].y;\n"
1918     "MAD R0.z, R0.y, R0.y, -R0;\n"
1919     "MUL R0.w, R0.x, c[1].x;\n"
1920     "RSQ R0.z, R0.z;\n"
1921     "RCP R0.x, R0.z;\n"
1922     "RCP R0.z, R0.w;\n"
1923     "ADD R0.x, -R0.y, R0;\n"
1924     "MUL R0.x, R0, R0.z;\n"
1925     "TEX R0, R0, texture[1], 1D;\n"
1926     "MAX R1.x, R0.w, c[6].w;\n"
1927     "RCP R1.x, R1.x;\n"
1928     "MAD R1.xyz, -R0, R1.x, c[6].z;\n"
1929     "MAX R2.xyz, R1, c[6].w;\n"
1930     "MUL R1.xy, fragment.position, c[5];\n"
1931     "TEX R1, R1, texture[0], 2D;\n"
1932     "ADD R2.w, -R0, c[6].z;\n"
1933     "MUL R3.xyz, R1, R2.w;\n"
1934     "ADD R2.w, -R1, c[6].z;\n"
1935     "MAD R3.xyz, R0, R2.w, R3;\n"
1936     "MUL R1.xyz, R0.w, R1;\n"
1937     "MAD R0.xyz, R0, R1.w, R1;\n"
1938     "MUL R2.w, R0, R1;\n"
1939     "RCP R2.x, R2.x;\n"
1940     "RCP R2.y, R2.y;\n"
1941     "RCP R2.z, R2.z;\n"
1942     "MAD R2.xyz, R1, R2, R3;\n"
1943     "MAD R3.xyz, R0.w, R1.w, R3;\n"
1944     "ADD R1.x, R0.w, R1.w;\n"
1945     "ADD R3.xyz, R3, -R2;\n"
1946     "SGE R0.xyz, R0, R2.w;\n"
1947     "MAD result.color.xyz, R0, R3, R2;\n"
1948     "MAD result.color.w, -R0, R1, R1.x;\n"
1949     "END\n"
1950     ;
1951 
1952 static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_RADIAL_COMPOSITION_MODES_COLORBURN_NOMASK =
1953     "!!ARBfp1.0\n"
1954     "PARAM c[7] = { program.local[0..5],\n"
1955     "		{ 2, 4, 1, 9.9999997e-006 } };\n"
1956     "TEMP R0;\n"
1957     "TEMP R1;\n"
1958     "TEMP R2;\n"
1959     "TEMP R3;\n"
1960     "TEMP R4;\n"
1961     "TEMP R5;\n"
1962     "MUL R0.xyz, fragment.position.y, c[3];\n"
1963     "MAD R0.xyz, fragment.position.x, c[2], R0;\n"
1964     "ADD R0.xyz, R0, c[4];\n"
1965     "RCP R0.z, R0.z;\n"
1966     "MUL R0.xy, R0, R0.z;\n"
1967     "MUL R0.zw, R0.xyxy, R0.xyxy;\n"
1968     "ADD R0.z, R0, R0.w;\n"
1969     "MUL R0.xy, R0, c[0];\n"
1970     "ADD R0.x, R0, R0.y;\n"
1971     "MUL R0.z, -R0, c[1].x;\n"
1972     "MUL R0.y, R0.x, c[6].x;\n"
1973     "MUL R0.z, R0, c[6].y;\n"
1974     "MAD R0.x, R0.y, R0.y, -R0.z;\n"
1975     "RSQ R0.z, R0.x;\n"
1976     "MOV R0.x, c[6];\n"
1977     "MUL R0.w, R0.x, c[1].x;\n"
1978     "RCP R0.z, R0.z;\n"
1979     "ADD R0.x, -R0.y, R0.z;\n"
1980     "RCP R0.y, R0.w;\n"
1981     "MUL R0.zw, fragment.position.xyxy, c[5].xyxy;\n"
1982     "TEX R1, R0.zwzw, texture[0], 2D;\n"
1983     "MUL R0.x, R0, R0.y;\n"
1984     "TEX R0, R0, texture[1], 1D;\n"
1985     "MUL R2.xyz, R0.w, R1;\n"
1986     "MAD R3.xyz, R0, R1.w, R2;\n"
1987     "ADD R2.w, -R1, c[6].z;\n"
1988     "MAD R2.xyz, -R0.w, R1.w, R3;\n"
1989     "MUL R4.xyz, R0.w, R2;\n"
1990     "MAX R2.xyz, R0, c[6].w;\n"
1991     "MUL R5.xyz, R0, R2.w;\n"
1992     "ADD R3.w, -R0, c[6].z;\n"
1993     "RCP R2.x, R2.x;\n"
1994     "RCP R2.y, R2.y;\n"
1995     "RCP R2.z, R2.z;\n"
1996     "MAD R2.xyz, R4, R2, R5;\n"
1997     "MUL R4.xyz, R1, R3.w;\n"
1998     "MAD R1.xyz, R1, R3.w, R2;\n"
1999     "MAD R0.xyz, R0, R2.w, R4;\n"
2000     "MUL R2.x, R0.w, R1.w;\n"
2001     "ADD R2.w, R0, R1;\n"
2002     "ADD R1.xyz, R1, -R0;\n"
2003     "SGE R2.xyz, R3, R2.x;\n"
2004     "MAD result.color.xyz, R2, R1, R0;\n"
2005     "MAD result.color.w, -R0, R1, R2;\n"
2006     "END\n"
2007     ;
2008 
2009 static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_RADIAL_COMPOSITION_MODES_HARDLIGHT_NOMASK =
2010     "!!ARBfp1.0\n"
2011     "PARAM c[7] = { program.local[0..5],\n"
2012     "		{ 2, 4, 1 } };\n"
2013     "TEMP R0;\n"
2014     "TEMP R1;\n"
2015     "TEMP R2;\n"
2016     "TEMP R3;\n"
2017     "TEMP R4;\n"
2018     "MUL R0.xyz, fragment.position.y, c[3];\n"
2019     "MAD R0.xyz, fragment.position.x, c[2], R0;\n"
2020     "ADD R0.xyz, R0, c[4];\n"
2021     "RCP R0.z, R0.z;\n"
2022     "MUL R0.xy, R0, R0.z;\n"
2023     "MUL R0.zw, R0.xyxy, R0.xyxy;\n"
2024     "ADD R0.z, R0, R0.w;\n"
2025     "MUL R0.xy, R0, c[0];\n"
2026     "ADD R0.x, R0, R0.y;\n"
2027     "MUL R0.y, R0.x, c[6].x;\n"
2028     "MOV R0.x, c[6];\n"
2029     "MUL R0.z, -R0, c[1].x;\n"
2030     "MUL R0.z, R0, c[6].y;\n"
2031     "MAD R0.z, R0.y, R0.y, -R0;\n"
2032     "MUL R1.xy, fragment.position, c[5];\n"
2033     "TEX R1, R1, texture[0], 2D;\n"
2034     "MUL R0.w, R0.x, c[1].x;\n"
2035     "RSQ R0.z, R0.z;\n"
2036     "RCP R0.x, R0.z;\n"
2037     "ADD R2.w, -R1, c[6].z;\n"
2038     "RCP R0.z, R0.w;\n"
2039     "ADD R0.x, -R0.y, R0;\n"
2040     "MUL R0.x, R0, R0.z;\n"
2041     "TEX R0, R0, texture[1], 1D;\n"
2042     "ADD R3.xyz, R0.w, -R0;\n"
2043     "ADD R2.xyz, R1.w, -R1;\n"
2044     "MUL R2.xyz, R2, R3;\n"
2045     "MUL R2.xyz, R2, c[6].x;\n"
2046     "MAD R2.xyz, R0.w, R1.w, -R2;\n"
2047     "MUL R4.xyz, R0, R2.w;\n"
2048     "MUL R3.xyz, R0, R1;\n"
2049     "MAD R2.xyz, R0, R2.w, R2;\n"
2050     "ADD R2.w, -R0, c[6].z;\n"
2051     "MUL R0.xyz, R0, c[6].x;\n"
2052     "MAD R2.xyz, R1, R2.w, R2;\n"
2053     "MAD R3.xyz, R3, c[6].x, R4;\n"
2054     "MAD R1.xyz, R1, R2.w, R3;\n"
2055     "ADD R2.w, R0, R1;\n"
2056     "ADD R2.xyz, R2, -R1;\n"
2057     "SGE R0.xyz, R0, R0.w;\n"
2058     "MAD result.color.xyz, R0, R2, R1;\n"
2059     "MAD result.color.w, -R0, R1, R2;\n"
2060     "END\n"
2061     ;
2062 
2063 static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_RADIAL_COMPOSITION_MODES_SOFTLIGHT_NOMASK =
2064     "!!ARBfp1.0\n"
2065     "PARAM c[8] = { program.local[0..5],\n"
2066     "		{ 2, 4, 1, 9.9999997e-006 },\n"
2067     "		{ 16, 12, 3 } };\n"
2068     "TEMP R0;\n"
2069     "TEMP R1;\n"
2070     "TEMP R2;\n"
2071     "TEMP R3;\n"
2072     "TEMP R4;\n"
2073     "TEMP R5;\n"
2074     "TEMP R6;\n"
2075     "MUL R0.xyz, fragment.position.y, c[3];\n"
2076     "MAD R0.xyz, fragment.position.x, c[2], R0;\n"
2077     "ADD R0.xyz, R0, c[4];\n"
2078     "RCP R0.z, R0.z;\n"
2079     "MUL R0.xy, R0, R0.z;\n"
2080     "MUL R0.zw, R0.xyxy, R0.xyxy;\n"
2081     "ADD R0.z, R0, R0.w;\n"
2082     "MUL R0.xy, R0, c[0];\n"
2083     "ADD R0.x, R0, R0.y;\n"
2084     "MUL R0.z, -R0, c[1].x;\n"
2085     "MUL R0.y, R0.z, c[6];\n"
2086     "MUL R0.x, R0, c[6];\n"
2087     "MUL R0.zw, fragment.position.xyxy, c[5].xyxy;\n"
2088     "TEX R1, R0.zwzw, texture[0], 2D;\n"
2089     "MAD R0.y, R0.x, R0.x, -R0;\n"
2090     "RSQ R0.y, R0.y;\n"
2091     "RCP R0.y, R0.y;\n"
2092     "ADD R0.y, -R0.x, R0;\n"
2093     "MOV R0.x, c[6];\n"
2094     "MUL R0.x, R0, c[1];\n"
2095     "MAX R0.z, R1.w, c[6].w;\n"
2096     "RCP R0.z, R0.z;\n"
2097     "MUL R3.xyz, R1, R0.z;\n"
2098     "MAD R4.xyz, R3, c[7].x, -c[7].y;\n"
2099     "RCP R0.x, R0.x;\n"
2100     "MUL R0.x, R0.y, R0;\n"
2101     "TEX R0, R0, texture[1], 1D;\n"
2102     "MAD R2.xyz, R0, c[6].x, -R0.w;\n"
2103     "MAD R4.xyz, R3, R4, c[7].z;\n"
2104     "MUL R5.xyz, R1.w, R2;\n"
2105     "MUL R6.xyz, R5, R4;\n"
2106     "RSQ R2.w, R3.x;\n"
2107     "RCP R4.x, R2.w;\n"
2108     "RSQ R2.w, R3.y;\n"
2109     "RSQ R3.w, R3.z;\n"
2110     "RCP R4.y, R2.w;\n"
2111     "RCP R4.z, R3.w;\n"
2112     "ADD R4.xyz, -R3, R4;\n"
2113     "MUL R6.xyz, R3, R6;\n"
2114     "MUL R4.xyz, R5, R4;\n"
2115     "ADD R3.xyz, -R3, c[6].z;\n"
2116     "MAD R2.xyz, R2, R3, R0.w;\n"
2117     "MUL R3.xyz, R0, c[6].x;\n"
2118     "MAD R5.xyz, R0.w, R1, R6;\n"
2119     "MAD R4.xyz, R0.w, R1, R4;\n"
2120     "ADD R6.xyz, R4, -R5;\n"
2121     "MUL R4.xyz, R1, c[6].y;\n"
2122     "SGE R4.xyz, R4, R1.w;\n"
2123     "MAD R4.xyz, R4, R6, R5;\n"
2124     "MAD R4.xyz, -R1, R2, R4;\n"
2125     "MUL R2.xyz, R1, R2;\n"
2126     "SGE R3.xyz, R3, R0.w;\n"
2127     "MAD R2.xyz, R3, R4, R2;\n"
2128     "ADD R2.w, -R1, c[6].z;\n"
2129     "MAD R2.xyz, R0, R2.w, R2;\n"
2130     "ADD R0.x, R0.w, R1.w;\n"
2131     "ADD R0.y, -R0.w, c[6].z;\n"
2132     "MAD result.color.xyz, R1, R0.y, R2;\n"
2133     "MAD result.color.w, -R0, R1, R0.x;\n"
2134     "END\n"
2135     ;
2136 
2137 static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_RADIAL_COMPOSITION_MODES_DIFFERENCE_NOMASK =
2138     "!!ARBfp1.0\n"
2139     "PARAM c[7] = { program.local[0..5],\n"
2140     "		{ 2, 4 } };\n"
2141     "TEMP R0;\n"
2142     "TEMP R1;\n"
2143     "TEMP R2;\n"
2144     "TEMP R3;\n"
2145     "MUL R0.xyz, fragment.position.y, c[3];\n"
2146     "MAD R0.xyz, fragment.position.x, c[2], R0;\n"
2147     "ADD R0.xyz, R0, c[4];\n"
2148     "RCP R0.z, R0.z;\n"
2149     "MUL R0.xy, R0, R0.z;\n"
2150     "MUL R0.zw, R0.xyxy, R0.xyxy;\n"
2151     "ADD R0.z, R0, R0.w;\n"
2152     "MUL R0.xy, R0, c[0];\n"
2153     "ADD R0.x, R0, R0.y;\n"
2154     "MUL R0.z, -R0, c[1].x;\n"
2155     "MUL R0.y, R0.x, c[6].x;\n"
2156     "MUL R0.z, R0, c[6].y;\n"
2157     "MAD R0.x, R0.y, R0.y, -R0.z;\n"
2158     "RSQ R0.z, R0.x;\n"
2159     "MOV R0.x, c[6];\n"
2160     "MUL R0.w, R0.x, c[1].x;\n"
2161     "RCP R0.z, R0.z;\n"
2162     "ADD R0.x, -R0.y, R0.z;\n"
2163     "RCP R0.y, R0.w;\n"
2164     "MUL R0.zw, fragment.position.xyxy, c[5].xyxy;\n"
2165     "TEX R1, R0.zwzw, texture[0], 2D;\n"
2166     "MUL R0.x, R0, R0.y;\n"
2167     "TEX R0, R0, texture[1], 1D;\n"
2168     "MUL R2.xyz, R0, R1.w;\n"
2169     "MUL R3.xyz, R0.w, R1;\n"
2170     "ADD R0.xyz, R0, R1;\n"
2171     "MIN R2.xyz, R2, R3;\n"
2172     "ADD R1.x, R0.w, R1.w;\n"
2173     "MAD result.color.xyz, -R2, c[6].x, R0;\n"
2174     "MAD result.color.w, -R0, R1, R1.x;\n"
2175     "END\n"
2176     ;
2177 
2178 static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_RADIAL_COMPOSITION_MODES_EXCLUSION_NOMASK =
2179     "!!ARBfp1.0\n"
2180     "PARAM c[7] = { program.local[0..5],\n"
2181     "		{ 2, 4, 1 } };\n"
2182     "TEMP R0;\n"
2183     "TEMP R1;\n"
2184     "TEMP R2;\n"
2185     "TEMP R3;\n"
2186     "MUL R0.xyz, fragment.position.y, c[3];\n"
2187     "MAD R0.xyz, fragment.position.x, c[2], R0;\n"
2188     "ADD R0.xyz, R0, c[4];\n"
2189     "RCP R0.z, R0.z;\n"
2190     "MUL R0.xy, R0, R0.z;\n"
2191     "MUL R0.zw, R0.xyxy, R0.xyxy;\n"
2192     "ADD R0.z, R0, R0.w;\n"
2193     "MUL R0.xy, R0, c[0];\n"
2194     "ADD R0.x, R0, R0.y;\n"
2195     "MUL R0.z, -R0, c[1].x;\n"
2196     "MUL R0.y, R0.x, c[6].x;\n"
2197     "MUL R0.z, R0, c[6].y;\n"
2198     "MAD R0.x, R0.y, R0.y, -R0.z;\n"
2199     "RSQ R0.z, R0.x;\n"
2200     "MOV R0.x, c[6];\n"
2201     "MUL R0.w, R0.x, c[1].x;\n"
2202     "RCP R0.z, R0.z;\n"
2203     "ADD R0.x, -R0.y, R0.z;\n"
2204     "RCP R0.y, R0.w;\n"
2205     "MUL R0.zw, fragment.position.xyxy, c[5].xyxy;\n"
2206     "TEX R1, R0.zwzw, texture[0], 2D;\n"
2207     "MUL R0.x, R0, R0.y;\n"
2208     "TEX R0, R0, texture[1], 1D;\n"
2209     "MUL R2.xyz, R0.w, R1;\n"
2210     "MAD R3.xyz, R0, R1.w, R2;\n"
2211     "MUL R2.xyz, R0, R1;\n"
2212     "MAD R2.xyz, -R2, c[6].x, R3;\n"
2213     "ADD R2.w, -R1, c[6].z;\n"
2214     "MAD R0.xyz, R0, R2.w, R2;\n"
2215     "ADD R2.x, R0.w, R1.w;\n"
2216     "ADD R2.y, -R0.w, c[6].z;\n"
2217     "MAD result.color.xyz, R1, R2.y, R0;\n"
2218     "MAD result.color.w, -R0, R1, R2.x;\n"
2219     "END\n"
2220     ;
2221 
2222 static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_RADIAL_COMPOSITION_MODE_BLEND_MODE_MASK =
2223     "!!ARBfp1.0\n"
2224     "PARAM c[9] = { program.local[0..7],\n"
2225     "		{ 2, 4 } };\n"
2226     "TEMP R0;\n"
2227     "TEMP R1;\n"
2228     "MUL R0.xyz, fragment.position.y, c[3];\n"
2229     "MAD R0.xyz, fragment.position.x, c[2], R0;\n"
2230     "ADD R0.xyz, R0, c[4];\n"
2231     "RCP R0.z, R0.z;\n"
2232     "MUL R0.xy, R0, R0.z;\n"
2233     "MUL R0.zw, R0.xyxy, R0.xyxy;\n"
2234     "ADD R0.z, R0, R0.w;\n"
2235     "MUL R0.xy, R0, c[0];\n"
2236     "ADD R0.x, R0, R0.y;\n"
2237     "MUL R0.z, -R0, c[1].x;\n"
2238     "MUL R0.y, R0.z, c[8];\n"
2239     "MUL R0.x, R0, c[8];\n"
2240     "MAD R0.y, R0.x, R0.x, -R0;\n"
2241     "RSQ R0.y, R0.y;\n"
2242     "RCP R0.y, R0.y;\n"
2243     "ADD R1.x, -R0, R0.y;\n"
2244     "MOV R0.x, c[8];\n"
2245     "MUL R0.x, R0, c[1];\n"
2246     "RCP R1.y, R0.x;\n"
2247     "ADD R0.zw, fragment.position.xyxy, c[6].xyxy;\n"
2248     "MUL R0.zw, R0, c[5].xyxy;\n"
2249     "TEX R0, R0.zwzw, texture[0], 2D;\n"
2250     "MUL R1.x, R1, R1.y;\n"
2251     "DP4 R1.y, R0, c[7];\n"
2252     "TEX R0, R1, texture[1], 1D;\n"
2253     "MUL result.color, R0, R1.y;\n"
2254     "END\n"
2255     ;
2256 
2257 static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_RADIAL_COMPOSITION_MODE_BLEND_MODE_NOMASK =
2258     "!!ARBfp1.0\n"
2259     "PARAM c[6] = { program.local[0..4],\n"
2260     "		{ 2, 4 } };\n"
2261     "TEMP R0;\n"
2262     "MUL R0.xyz, fragment.position.y, c[3];\n"
2263     "MAD R0.xyz, fragment.position.x, c[2], R0;\n"
2264     "ADD R0.xyz, R0, c[4];\n"
2265     "RCP R0.z, R0.z;\n"
2266     "MUL R0.xy, R0, R0.z;\n"
2267     "MUL R0.zw, R0.xyxy, R0.xyxy;\n"
2268     "MUL R0.xy, R0, c[0];\n"
2269     "ADD R0.z, R0, R0.w;\n"
2270     "ADD R0.x, R0, R0.y;\n"
2271     "MUL R0.z, -R0, c[1].x;\n"
2272     "MUL R0.y, R0.z, c[5];\n"
2273     "MUL R0.x, R0, c[5];\n"
2274     "MAD R0.z, R0.x, R0.x, -R0.y;\n"
2275     "MOV R0.y, c[5].x;\n"
2276     "RSQ R0.z, R0.z;\n"
2277     "MUL R0.w, R0.y, c[1].x;\n"
2278     "RCP R0.y, R0.z;\n"
2279     "RCP R0.z, R0.w;\n"
2280     "ADD R0.x, -R0, R0.y;\n"
2281     "MUL R0.x, R0, R0.z;\n"
2282     "TEX result.color, R0, texture[0], 1D;\n"
2283     "END\n"
2284     ;
2285 
2286 static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_CONICAL_COMPOSITION_MODES_SIMPLE_PORTER_DUFF =
2287     "!!ARBfp1.0\n"
2288     "PARAM c[13] = { program.local[0..9],\n"
2289     "		{ 0.15915494, 0.0020000001, 3.141593, 1.570796 },\n"
2290     "		{ -0.01348047, 0.05747731, 0.1212391, 0.1956359 },\n"
2291     "		{ 0.33299461, 0.99999559, 1 } };\n"
2292     "TEMP R0;\n"
2293     "TEMP R1;\n"
2294     "TEMP R2;\n"
2295     "TEMP R3;\n"
2296     "MUL R0.xyz, fragment.position.y, c[2];\n"
2297     "MAD R0.xyz, fragment.position.x, c[1], R0;\n"
2298     "ADD R0.xyz, R0, c[3];\n"
2299     "RCP R0.z, R0.z;\n"
2300     "MUL R0.xy, R0, R0.z;\n"
2301     "ABS R0.z, R0.x;\n"
2302     "ABS R0.w, R0.y;\n"
2303     "ADD R0.w, R0, -R0.z;\n"
2304     "ADD R1.x, R0.y, c[10].y;\n"
2305     "ABS R0.w, R0;\n"
2306     "CMP R0.y, -R0.w, R0, R1.x;\n"
2307     "ABS R0.w, -R0.y;\n"
2308     "MAX R1.x, R0.z, R0.w;\n"
2309     "RCP R1.y, R1.x;\n"
2310     "MIN R1.x, R0.z, R0.w;\n"
2311     "MUL R1.x, R1, R1.y;\n"
2312     "MUL R1.y, R1.x, R1.x;\n"
2313     "MAD R1.z, R1.y, c[11].x, c[11].y;\n"
2314     "MAD R1.z, R1, R1.y, -c[11];\n"
2315     "MAD R1.z, R1, R1.y, c[11].w;\n"
2316     "MAD R1.z, R1, R1.y, -c[12].x;\n"
2317     "MAD R1.y, R1.z, R1, c[12];\n"
2318     "MUL R1.x, R1.y, R1;\n"
2319     "ADD R1.y, -R1.x, c[10].w;\n"
2320     "ADD R0.z, -R0, R0.w;\n"
2321     "CMP R0.z, -R0, R1.y, R1.x;\n"
2322     "ADD R0.w, -R0.z, c[10].z;\n"
2323     "CMP R0.x, R0, R0.w, R0.z;\n"
2324     "CMP R0.x, -R0.y, -R0, R0;\n"
2325     "ADD R0.x, R0, c[0];\n"
2326     "MUL R1.x, R0, c[10];\n"
2327     "FLR R1.y, R1.x;\n"
2328     "MUL R0.xy, fragment.position, c[7];\n"
2329     "TEX R0, R0, texture[0], 2D;\n"
2330     "ADD R1.x, R1, -R1.y;\n"
2331     "TEX R1, R1, texture[2], 1D;\n"
2332     "MUL R2.xyz, R0, c[4].y;\n"
2333     "MUL R3.xyz, R1.w, R2;\n"
2334     "MUL R2.xyz, R1, c[4].x;\n"
2335     "MAD R2.xyz, R0.w, R2, R3;\n"
2336     "ADD R3.xy, fragment.position, c[8];\n"
2337     "ADD R2.w, -R0, c[12].z;\n"
2338     "MUL R1.xyz, R1, c[5].y;\n"
2339     "MAD R2.xyz, R2.w, R1, R2;\n"
2340     "MUL R1.xyz, R0, c[5].z;\n"
2341     "ADD R3.z, -R1.w, c[12];\n"
2342     "MAD R2.xyz, R3.z, R1, R2;\n"
2343     "MUL R1.y, R1.w, R2.w;\n"
2344     "MUL R1.x, R1.w, R0.w;\n"
2345     "MUL R1.z, R0.w, R3;\n"
2346     "DP3 R2.w, R1, c[5];\n"
2347     "MUL R3.xy, R3, c[6];\n"
2348     "TEX R1, R3, texture[1], 2D;\n"
2349     "ADD R2, R2, -R0;\n"
2350     "DP4 R1.x, R1, c[9];\n"
2351     "MAD result.color, R1.x, R2, R0;\n"
2352     "END\n"
2353     ;
2354 
2355 static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_CONICAL_COMPOSITION_MODES_MULTIPLY =
2356     "!!ARBfp1.0\n"
2357     "PARAM c[11] = { program.local[0..7],\n"
2358     "		{ 0.15915494, 0.0020000001, 3.141593, 1.570796 },\n"
2359     "		{ -0.01348047, 0.05747731, 0.1212391, 0.1956359 },\n"
2360     "		{ 0.33299461, 0.99999559, 1 } };\n"
2361     "TEMP R0;\n"
2362     "TEMP R1;\n"
2363     "TEMP R2;\n"
2364     "MUL R0.xyz, fragment.position.y, c[2];\n"
2365     "MAD R0.xyz, fragment.position.x, c[1], R0;\n"
2366     "ADD R0.xyz, R0, c[3];\n"
2367     "RCP R0.z, R0.z;\n"
2368     "MUL R0.xy, R0, R0.z;\n"
2369     "ABS R0.z, R0.x;\n"
2370     "ABS R0.w, R0.y;\n"
2371     "ADD R0.w, R0, -R0.z;\n"
2372     "ADD R1.x, R0.y, c[8].y;\n"
2373     "ABS R0.w, R0;\n"
2374     "CMP R0.y, -R0.w, R0, R1.x;\n"
2375     "ABS R0.w, -R0.y;\n"
2376     "MAX R1.x, R0.z, R0.w;\n"
2377     "RCP R1.y, R1.x;\n"
2378     "MIN R1.x, R0.z, R0.w;\n"
2379     "MUL R1.x, R1, R1.y;\n"
2380     "MUL R1.y, R1.x, R1.x;\n"
2381     "MAD R1.z, R1.y, c[9].x, c[9].y;\n"
2382     "MAD R1.z, R1, R1.y, -c[9];\n"
2383     "MAD R1.z, R1, R1.y, c[9].w;\n"
2384     "MAD R1.z, R1, R1.y, -c[10].x;\n"
2385     "MAD R1.y, R1.z, R1, c[10];\n"
2386     "MUL R1.x, R1.y, R1;\n"
2387     "ADD R1.y, -R1.x, c[8].w;\n"
2388     "ADD R0.z, -R0, R0.w;\n"
2389     "CMP R0.z, -R0, R1.y, R1.x;\n"
2390     "ADD R0.w, -R0.z, c[8].z;\n"
2391     "CMP R0.x, R0, R0.w, R0.z;\n"
2392     "CMP R0.x, -R0.y, -R0, R0;\n"
2393     "ADD R0.x, R0, c[0];\n"
2394     "MUL R1.x, R0, c[8];\n"
2395     "FLR R1.y, R1.x;\n"
2396     "MUL R0.xy, fragment.position, c[5];\n"
2397     "TEX R0, R0, texture[0], 2D;\n"
2398     "ADD R1.x, R1, -R1.y;\n"
2399     "TEX R1, R1, texture[2], 1D;\n"
2400     "ADD R2.x, -R0.w, c[10].z;\n"
2401     "MUL R2.xyz, R1, R2.x;\n"
2402     "MAD R1.xyz, R1, R0, R2;\n"
2403     "ADD R2.x, -R1.w, c[10].z;\n"
2404     "MAD R2.xyz, R0, R2.x, R1;\n"
2405     "ADD R1.z, R1.w, R0.w;\n"
2406     "MAD R2.w, -R1, R0, R1.z;\n"
2407     "ADD R1.xy, fragment.position, c[6];\n"
2408     "MUL R1.xy, R1, c[4];\n"
2409     "TEX R1, R1, texture[1], 2D;\n"
2410     "ADD R2, R2, -R0;\n"
2411     "DP4 R1.x, R1, c[7];\n"
2412     "MAD result.color, R1.x, R2, R0;\n"
2413     "END\n"
2414     ;
2415 
2416 static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_CONICAL_COMPOSITION_MODES_SCREEN =
2417     "!!ARBfp1.0\n"
2418     "PARAM c[11] = { program.local[0..7],\n"
2419     "		{ 0.15915494, 0.0020000001, 3.141593, 1.570796 },\n"
2420     "		{ -0.01348047, 0.05747731, 0.1212391, 0.1956359 },\n"
2421     "		{ 0.33299461, 0.99999559 } };\n"
2422     "TEMP R0;\n"
2423     "TEMP R1;\n"
2424     "TEMP R2;\n"
2425     "TEMP R3;\n"
2426     "MUL R0.xyz, fragment.position.y, c[2];\n"
2427     "MAD R0.xyz, fragment.position.x, c[1], R0;\n"
2428     "ADD R0.xyz, R0, c[3];\n"
2429     "RCP R0.z, R0.z;\n"
2430     "MUL R0.xy, R0, R0.z;\n"
2431     "ADD R3.xy, fragment.position, c[6];\n"
2432     "ABS R0.z, R0.x;\n"
2433     "ABS R0.w, R0.y;\n"
2434     "ADD R0.w, R0, -R0.z;\n"
2435     "ADD R1.x, R0.y, c[8].y;\n"
2436     "ABS R0.w, R0;\n"
2437     "CMP R0.y, -R0.w, R0, R1.x;\n"
2438     "ABS R0.w, -R0.y;\n"
2439     "MAX R1.x, R0.z, R0.w;\n"
2440     "RCP R1.y, R1.x;\n"
2441     "MIN R1.x, R0.z, R0.w;\n"
2442     "MUL R1.x, R1, R1.y;\n"
2443     "MUL R1.y, R1.x, R1.x;\n"
2444     "MAD R1.z, R1.y, c[9].x, c[9].y;\n"
2445     "MAD R1.z, R1, R1.y, -c[9];\n"
2446     "MAD R1.z, R1, R1.y, c[9].w;\n"
2447     "MAD R1.z, R1, R1.y, -c[10].x;\n"
2448     "MAD R1.y, R1.z, R1, c[10];\n"
2449     "MUL R1.x, R1.y, R1;\n"
2450     "ADD R0.z, -R0, R0.w;\n"
2451     "ADD R1.y, -R1.x, c[8].w;\n"
2452     "CMP R0.z, -R0, R1.y, R1.x;\n"
2453     "ADD R0.w, -R0.z, c[8].z;\n"
2454     "CMP R0.x, R0, R0.w, R0.z;\n"
2455     "CMP R0.x, -R0.y, -R0, R0;\n"
2456     "ADD R0.x, R0, c[0];\n"
2457     "MUL R0.x, R0, c[8];\n"
2458     "FLR R0.y, R0.x;\n"
2459     "ADD R0.z, R0.x, -R0.y;\n"
2460     "TEX R1, R0.z, texture[2], 1D;\n"
2461     "MUL R0.xy, fragment.position, c[5];\n"
2462     "TEX R0, R0, texture[0], 2D;\n"
2463     "ADD R2, R1, R0;\n"
2464     "MAD R2, -R1, R0, R2;\n"
2465     "MUL R3.xy, R3, c[4];\n"
2466     "TEX R1, R3, texture[1], 2D;\n"
2467     "ADD R2, R2, -R0;\n"
2468     "DP4 R1.x, R1, c[7];\n"
2469     "MAD result.color, R1.x, R2, R0;\n"
2470     "END\n"
2471     ;
2472 
2473 static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_CONICAL_COMPOSITION_MODES_OVERLAY =
2474     "!!ARBfp1.0\n"
2475     "PARAM c[11] = { program.local[0..7],\n"
2476     "		{ 0.0020000001, -0.01348047, 0.05747731, 0.1212391 },\n"
2477     "		{ 0.1956359, 0.33299461, 0.99999559, 1.570796 },\n"
2478     "		{ 3.141593, 0.15915494, 2, 1 } };\n"
2479     "TEMP R0;\n"
2480     "TEMP R1;\n"
2481     "TEMP R2;\n"
2482     "TEMP R3;\n"
2483     "TEMP R4;\n"
2484     "MUL R0.xyz, fragment.position.y, c[2];\n"
2485     "MAD R0.xyz, fragment.position.x, c[1], R0;\n"
2486     "ADD R0.xyz, R0, c[3];\n"
2487     "RCP R0.z, R0.z;\n"
2488     "MUL R0.xy, R0, R0.z;\n"
2489     "ABS R0.z, R0.x;\n"
2490     "ABS R0.w, R0.y;\n"
2491     "ADD R0.w, R0, -R0.z;\n"
2492     "ADD R1.x, R0.y, c[8];\n"
2493     "ABS R0.w, R0;\n"
2494     "CMP R0.y, -R0.w, R0, R1.x;\n"
2495     "ABS R0.w, -R0.y;\n"
2496     "MAX R1.x, R0.z, R0.w;\n"
2497     "RCP R1.y, R1.x;\n"
2498     "MIN R1.x, R0.z, R0.w;\n"
2499     "MUL R1.x, R1, R1.y;\n"
2500     "MUL R1.y, R1.x, R1.x;\n"
2501     "MAD R1.z, R1.y, c[8].y, c[8];\n"
2502     "MAD R1.z, R1, R1.y, -c[8].w;\n"
2503     "MAD R1.z, R1, R1.y, c[9].x;\n"
2504     "MAD R1.z, R1, R1.y, -c[9].y;\n"
2505     "MAD R1.y, R1.z, R1, c[9].z;\n"
2506     "MUL R1.x, R1.y, R1;\n"
2507     "ADD R0.z, -R0, R0.w;\n"
2508     "ADD R1.y, -R1.x, c[9].w;\n"
2509     "CMP R0.z, -R0, R1.y, R1.x;\n"
2510     "ADD R0.w, -R0.z, c[10].x;\n"
2511     "CMP R0.x, R0, R0.w, R0.z;\n"
2512     "CMP R0.x, -R0.y, -R0, R0;\n"
2513     "ADD R0.x, R0, c[0];\n"
2514     "MUL R0.x, R0, c[10].y;\n"
2515     "FLR R0.y, R0.x;\n"
2516     "ADD R0.x, R0, -R0.y;\n"
2517     "TEX R0, R0, texture[2], 1D;\n"
2518     "MUL R1.xy, fragment.position, c[5];\n"
2519     "TEX R1, R1, texture[0], 2D;\n"
2520     "ADD R2.w, -R1, c[10];\n"
2521     "ADD R3.xyz, R0.w, -R0;\n"
2522     "ADD R2.xyz, R1.w, -R1;\n"
2523     "MUL R2.xyz, R2, R3;\n"
2524     "MUL R2.xyz, R2, c[10].z;\n"
2525     "MAD R2.xyz, R0.w, R1.w, -R2;\n"
2526     "MUL R4.xyz, R0, R2.w;\n"
2527     "MUL R3.xyz, R0, R1;\n"
2528     "MAD R0.xyz, R0, R2.w, R2;\n"
2529     "ADD R2.x, -R0.w, c[10].w;\n"
2530     "MAD R3.xyz, R3, c[10].z, R4;\n"
2531     "MAD R3.xyz, R1, R2.x, R3;\n"
2532     "MAD R0.xyz, R1, R2.x, R0;\n"
2533     "MUL R2.xyz, R1, c[10].z;\n"
2534     "ADD R0.xyz, R0, -R3;\n"
2535     "SGE R2.xyz, R2, R1.w;\n"
2536     "MAD R2.xyz, R2, R0, R3;\n"
2537     "ADD R0.z, R0.w, R1.w;\n"
2538     "MAD R2.w, -R0, R1, R0.z;\n"
2539     "ADD R0.xy, fragment.position, c[6];\n"
2540     "MUL R0.xy, R0, c[4];\n"
2541     "TEX R0, R0, texture[1], 2D;\n"
2542     "ADD R2, R2, -R1;\n"
2543     "DP4 R0.x, R0, c[7];\n"
2544     "MAD result.color, R0.x, R2, R1;\n"
2545     "END\n"
2546     ;
2547 
2548 static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_CONICAL_COMPOSITION_MODES_DARKEN =
2549     "!!ARBfp1.0\n"
2550     "PARAM c[11] = { program.local[0..7],\n"
2551     "		{ 0.15915494, 0.0020000001, 3.141593, 1.570796 },\n"
2552     "		{ -0.01348047, 0.05747731, 0.1212391, 0.1956359 },\n"
2553     "		{ 0.33299461, 0.99999559, 1 } };\n"
2554     "TEMP R0;\n"
2555     "TEMP R1;\n"
2556     "TEMP R2;\n"
2557     "TEMP R3;\n"
2558     "MUL R0.xyz, fragment.position.y, c[2];\n"
2559     "MAD R0.xyz, fragment.position.x, c[1], R0;\n"
2560     "ADD R0.xyz, R0, c[3];\n"
2561     "RCP R0.z, R0.z;\n"
2562     "MUL R0.xy, R0, R0.z;\n"
2563     "ABS R0.z, R0.x;\n"
2564     "ABS R0.w, R0.y;\n"
2565     "ADD R0.w, R0, -R0.z;\n"
2566     "ADD R1.x, R0.y, c[8].y;\n"
2567     "ABS R0.w, R0;\n"
2568     "CMP R0.y, -R0.w, R0, R1.x;\n"
2569     "ABS R0.w, -R0.y;\n"
2570     "MAX R1.x, R0.z, R0.w;\n"
2571     "RCP R1.y, R1.x;\n"
2572     "MIN R1.x, R0.z, R0.w;\n"
2573     "MUL R1.x, R1, R1.y;\n"
2574     "MUL R1.y, R1.x, R1.x;\n"
2575     "MAD R1.z, R1.y, c[9].x, c[9].y;\n"
2576     "MAD R1.z, R1, R1.y, -c[9];\n"
2577     "MAD R1.z, R1, R1.y, c[9].w;\n"
2578     "MAD R1.z, R1, R1.y, -c[10].x;\n"
2579     "MAD R1.y, R1.z, R1, c[10];\n"
2580     "MUL R1.x, R1.y, R1;\n"
2581     "ADD R1.y, -R1.x, c[8].w;\n"
2582     "ADD R0.z, -R0, R0.w;\n"
2583     "CMP R0.z, -R0, R1.y, R1.x;\n"
2584     "ADD R0.w, -R0.z, c[8].z;\n"
2585     "CMP R0.x, R0, R0.w, R0.z;\n"
2586     "CMP R0.x, -R0.y, -R0, R0;\n"
2587     "ADD R0.x, R0, c[0];\n"
2588     "MUL R0.z, R0.x, c[8].x;\n"
2589     "FLR R0.w, R0.z;\n"
2590     "ADD R1.x, R0.z, -R0.w;\n"
2591     "MUL R0.xy, fragment.position, c[5];\n"
2592     "TEX R0, R0, texture[0], 2D;\n"
2593     "TEX R1, R1, texture[2], 1D;\n"
2594     "MUL R3.xyz, R1.w, R0;\n"
2595     "MUL R2.xyz, R1, R0.w;\n"
2596     "MIN R2.xyz, R2, R3;\n"
2597     "ADD R2.w, -R0, c[10].z;\n"
2598     "MAD R1.xyz, R1, R2.w, R2;\n"
2599     "ADD R2.x, -R1.w, c[10].z;\n"
2600     "MAD R2.xyz, R0, R2.x, R1;\n"
2601     "ADD R1.z, R1.w, R0.w;\n"
2602     "MAD R2.w, -R1, R0, R1.z;\n"
2603     "ADD R1.xy, fragment.position, c[6];\n"
2604     "MUL R1.xy, R1, c[4];\n"
2605     "TEX R1, R1, texture[1], 2D;\n"
2606     "ADD R2, R2, -R0;\n"
2607     "DP4 R1.x, R1, c[7];\n"
2608     "MAD result.color, R1.x, R2, R0;\n"
2609     "END\n"
2610     ;
2611 
2612 static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_CONICAL_COMPOSITION_MODES_LIGHTEN =
2613     "!!ARBfp1.0\n"
2614     "PARAM c[11] = { program.local[0..7],\n"
2615     "		{ 0.15915494, 0.0020000001, 3.141593, 1.570796 },\n"
2616     "		{ -0.01348047, 0.05747731, 0.1212391, 0.1956359 },\n"
2617     "		{ 0.33299461, 0.99999559, 1 } };\n"
2618     "TEMP R0;\n"
2619     "TEMP R1;\n"
2620     "TEMP R2;\n"
2621     "TEMP R3;\n"
2622     "MUL R0.xyz, fragment.position.y, c[2];\n"
2623     "MAD R0.xyz, fragment.position.x, c[1], R0;\n"
2624     "ADD R0.xyz, R0, c[3];\n"
2625     "RCP R0.z, R0.z;\n"
2626     "MUL R0.xy, R0, R0.z;\n"
2627     "ABS R0.z, R0.x;\n"
2628     "ABS R0.w, R0.y;\n"
2629     "ADD R0.w, R0, -R0.z;\n"
2630     "ADD R1.x, R0.y, c[8].y;\n"
2631     "ABS R0.w, R0;\n"
2632     "CMP R0.y, -R0.w, R0, R1.x;\n"
2633     "ABS R0.w, -R0.y;\n"
2634     "MAX R1.x, R0.z, R0.w;\n"
2635     "RCP R1.y, R1.x;\n"
2636     "MIN R1.x, R0.z, R0.w;\n"
2637     "MUL R1.x, R1, R1.y;\n"
2638     "MUL R1.y, R1.x, R1.x;\n"
2639     "MAD R1.z, R1.y, c[9].x, c[9].y;\n"
2640     "MAD R1.z, R1, R1.y, -c[9];\n"
2641     "MAD R1.z, R1, R1.y, c[9].w;\n"
2642     "MAD R1.z, R1, R1.y, -c[10].x;\n"
2643     "MAD R1.y, R1.z, R1, c[10];\n"
2644     "MUL R1.x, R1.y, R1;\n"
2645     "ADD R1.y, -R1.x, c[8].w;\n"
2646     "ADD R0.z, -R0, R0.w;\n"
2647     "CMP R0.z, -R0, R1.y, R1.x;\n"
2648     "ADD R0.w, -R0.z, c[8].z;\n"
2649     "CMP R0.x, R0, R0.w, R0.z;\n"
2650     "CMP R0.x, -R0.y, -R0, R0;\n"
2651     "ADD R0.x, R0, c[0];\n"
2652     "MUL R0.z, R0.x, c[8].x;\n"
2653     "FLR R0.w, R0.z;\n"
2654     "ADD R1.x, R0.z, -R0.w;\n"
2655     "MUL R0.xy, fragment.position, c[5];\n"
2656     "TEX R0, R0, texture[0], 2D;\n"
2657     "TEX R1, R1, texture[2], 1D;\n"
2658     "MUL R3.xyz, R1.w, R0;\n"
2659     "MUL R2.xyz, R1, R0.w;\n"
2660     "MAX R2.xyz, R2, R3;\n"
2661     "ADD R2.w, -R0, c[10].z;\n"
2662     "MAD R1.xyz, R1, R2.w, R2;\n"
2663     "ADD R2.x, -R1.w, c[10].z;\n"
2664     "MAD R2.xyz, R0, R2.x, R1;\n"
2665     "ADD R1.z, R1.w, R0.w;\n"
2666     "MAD R2.w, -R1, R0, R1.z;\n"
2667     "ADD R1.xy, fragment.position, c[6];\n"
2668     "MUL R1.xy, R1, c[4];\n"
2669     "TEX R1, R1, texture[1], 2D;\n"
2670     "ADD R2, R2, -R0;\n"
2671     "DP4 R1.x, R1, c[7];\n"
2672     "MAD result.color, R1.x, R2, R0;\n"
2673     "END\n"
2674     ;
2675 
2676 static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_CONICAL_COMPOSITION_MODES_COLORDODGE =
2677     "!!ARBfp1.0\n"
2678     "PARAM c[11] = { program.local[0..7],\n"
2679     "		{ 0.0020000001, -0.01348047, 0.05747731, 0.1212391 },\n"
2680     "		{ 0.1956359, 0.33299461, 0.99999559, 1.570796 },\n"
2681     "		{ 3.141593, 0.15915494, 1, 1e-006 } };\n"
2682     "TEMP R0;\n"
2683     "TEMP R1;\n"
2684     "TEMP R2;\n"
2685     "TEMP R3;\n"
2686     "TEMP R4;\n"
2687     "MUL R0.xyz, fragment.position.y, c[2];\n"
2688     "MAD R0.xyz, fragment.position.x, c[1], R0;\n"
2689     "ADD R0.xyz, R0, c[3];\n"
2690     "RCP R0.z, R0.z;\n"
2691     "MUL R0.xy, R0, R0.z;\n"
2692     "ABS R0.z, R0.x;\n"
2693     "ABS R0.w, R0.y;\n"
2694     "ADD R0.w, R0, -R0.z;\n"
2695     "ADD R1.x, R0.y, c[8];\n"
2696     "ABS R0.w, R0;\n"
2697     "CMP R0.y, -R0.w, R0, R1.x;\n"
2698     "ABS R0.w, -R0.y;\n"
2699     "MAX R1.x, R0.z, R0.w;\n"
2700     "RCP R1.y, R1.x;\n"
2701     "MIN R1.x, R0.z, R0.w;\n"
2702     "MUL R1.x, R1, R1.y;\n"
2703     "MUL R1.y, R1.x, R1.x;\n"
2704     "MAD R1.z, R1.y, c[8].y, c[8];\n"
2705     "MAD R1.z, R1, R1.y, -c[8].w;\n"
2706     "MAD R1.z, R1, R1.y, c[9].x;\n"
2707     "MAD R1.z, R1, R1.y, -c[9].y;\n"
2708     "MAD R1.y, R1.z, R1, c[9].z;\n"
2709     "MUL R1.x, R1.y, R1;\n"
2710     "ADD R1.y, -R1.x, c[9].w;\n"
2711     "ADD R0.z, -R0, R0.w;\n"
2712     "CMP R0.z, -R0, R1.y, R1.x;\n"
2713     "ADD R0.w, -R0.z, c[10].x;\n"
2714     "CMP R0.x, R0, R0.w, R0.z;\n"
2715     "CMP R0.x, -R0.y, -R0, R0;\n"
2716     "ADD R0.x, R0, c[0];\n"
2717     "MUL R0.x, R0, c[10].y;\n"
2718     "FLR R0.y, R0.x;\n"
2719     "ADD R0.x, R0, -R0.y;\n"
2720     "TEX R0, R0, texture[2], 1D;\n"
2721     "MAX R1.x, R0.w, c[10].w;\n"
2722     "RCP R1.x, R1.x;\n"
2723     "MAD R1.xyz, -R0, R1.x, c[10].z;\n"
2724     "MAX R2.xyz, R1, c[10].w;\n"
2725     "MUL R1.xy, fragment.position, c[5];\n"
2726     "TEX R1, R1, texture[0], 2D;\n"
2727     "ADD R2.w, -R0, c[10].z;\n"
2728     "MUL R3.xyz, R1, R2.w;\n"
2729     "ADD R2.w, -R1, c[10].z;\n"
2730     "MAD R4.xyz, R0, R2.w, R3;\n"
2731     "MUL R3.xyz, R0.w, R1;\n"
2732     "MUL R2.w, R0, R1;\n"
2733     "MAD R0.xyz, R0, R1.w, R3;\n"
2734     "SGE R0.xyz, R0, R2.w;\n"
2735     "RCP R2.x, R2.x;\n"
2736     "RCP R2.y, R2.y;\n"
2737     "RCP R2.z, R2.z;\n"
2738     "MAD R2.xyz, R3, R2, R4;\n"
2739     "MAD R4.xyz, R0.w, R1.w, R4;\n"
2740     "ADD R4.xyz, R4, -R2;\n"
2741     "MAD R2.xyz, R0, R4, R2;\n"
2742     "ADD R0.z, R0.w, R1.w;\n"
2743     "MAD R2.w, -R0, R1, R0.z;\n"
2744     "ADD R0.xy, fragment.position, c[6];\n"
2745     "MUL R0.xy, R0, c[4];\n"
2746     "TEX R0, R0, texture[1], 2D;\n"
2747     "ADD R2, R2, -R1;\n"
2748     "DP4 R0.x, R0, c[7];\n"
2749     "MAD result.color, R0.x, R2, R1;\n"
2750     "END\n"
2751     ;
2752 
2753 static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_CONICAL_COMPOSITION_MODES_COLORBURN =
2754     "!!ARBfp1.0\n"
2755     "PARAM c[11] = { program.local[0..7],\n"
2756     "		{ 0.0020000001, -0.01348047, 0.05747731, 0.1212391 },\n"
2757     "		{ 0.1956359, 0.33299461, 0.99999559, 1.570796 },\n"
2758     "		{ 3.141593, 0.15915494, 1, 9.9999997e-006 } };\n"
2759     "TEMP R0;\n"
2760     "TEMP R1;\n"
2761     "TEMP R2;\n"
2762     "TEMP R3;\n"
2763     "TEMP R4;\n"
2764     "TEMP R5;\n"
2765     "MUL R0.xyz, fragment.position.y, c[2];\n"
2766     "MAD R0.xyz, fragment.position.x, c[1], R0;\n"
2767     "ADD R0.xyz, R0, c[3];\n"
2768     "RCP R0.z, R0.z;\n"
2769     "MUL R0.xy, R0, R0.z;\n"
2770     "ABS R0.w, R0.x;\n"
2771     "ABS R0.z, R0.y;\n"
2772     "ADD R0.z, R0, -R0.w;\n"
2773     "ADD R1.x, R0.y, c[8];\n"
2774     "ABS R0.z, R0;\n"
2775     "CMP R0.y, -R0.z, R0, R1.x;\n"
2776     "ABS R0.z, -R0.y;\n"
2777     "MAX R1.x, R0.w, R0.z;\n"
2778     "RCP R1.y, R1.x;\n"
2779     "MIN R1.x, R0.w, R0.z;\n"
2780     "MUL R1.x, R1, R1.y;\n"
2781     "MUL R1.y, R1.x, R1.x;\n"
2782     "MAD R1.z, R1.y, c[8].y, c[8];\n"
2783     "MAD R1.z, R1, R1.y, -c[8].w;\n"
2784     "MAD R1.z, R1, R1.y, c[9].x;\n"
2785     "MAD R1.z, R1, R1.y, -c[9].y;\n"
2786     "MAD R1.y, R1.z, R1, c[9].z;\n"
2787     "MUL R1.x, R1.y, R1;\n"
2788     "ADD R1.y, -R1.x, c[9].w;\n"
2789     "ADD R0.z, -R0.w, R0;\n"
2790     "CMP R0.z, -R0, R1.y, R1.x;\n"
2791     "ADD R0.w, -R0.z, c[10].x;\n"
2792     "CMP R0.x, R0, R0.w, R0.z;\n"
2793     "CMP R0.x, -R0.y, -R0, R0;\n"
2794     "MUL R0.zw, fragment.position.xyxy, c[5].xyxy;\n"
2795     "TEX R1, R0.zwzw, texture[0], 2D;\n"
2796     "ADD R0.x, R0, c[0];\n"
2797     "MUL R0.x, R0, c[10].y;\n"
2798     "FLR R0.y, R0.x;\n"
2799     "ADD R0.x, R0, -R0.y;\n"
2800     "TEX R0, R0, texture[2], 1D;\n"
2801     "MUL R2.xyz, R0.w, R1;\n"
2802     "MAD R3.xyz, R0, R1.w, R2;\n"
2803     "MAD R2.xyz, -R0.w, R1.w, R3;\n"
2804     "MUL R4.xyz, R0.w, R2;\n"
2805     "MAX R2.xyz, R0, c[10].w;\n"
2806     "ADD R2.w, -R1, c[10].z;\n"
2807     "ADD R3.w, -R0, c[10].z;\n"
2808     "MUL R5.xyz, R0, R2.w;\n"
2809     "RCP R2.x, R2.x;\n"
2810     "RCP R2.y, R2.y;\n"
2811     "RCP R2.z, R2.z;\n"
2812     "MAD R2.xyz, R4, R2, R5;\n"
2813     "MUL R4.xyz, R1, R3.w;\n"
2814     "MAD R0.xyz, R0, R2.w, R4;\n"
2815     "MUL R2.w, R0, R1;\n"
2816     "MAD R2.xyz, R1, R3.w, R2;\n"
2817     "ADD R2.xyz, R2, -R0;\n"
2818     "SGE R3.xyz, R3, R2.w;\n"
2819     "MAD R2.xyz, R3, R2, R0;\n"
2820     "ADD R0.z, R0.w, R1.w;\n"
2821     "MAD R2.w, -R0, R1, R0.z;\n"
2822     "ADD R0.xy, fragment.position, c[6];\n"
2823     "MUL R0.xy, R0, c[4];\n"
2824     "TEX R0, R0, texture[1], 2D;\n"
2825     "ADD R2, R2, -R1;\n"
2826     "DP4 R0.x, R0, c[7];\n"
2827     "MAD result.color, R0.x, R2, R1;\n"
2828     "END\n"
2829     ;
2830 
2831 static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_CONICAL_COMPOSITION_MODES_HARDLIGHT =
2832     "!!ARBfp1.0\n"
2833     "PARAM c[11] = { program.local[0..7],\n"
2834     "		{ 0.0020000001, -0.01348047, 0.05747731, 0.1212391 },\n"
2835     "		{ 0.1956359, 0.33299461, 0.99999559, 1.570796 },\n"
2836     "		{ 3.141593, 0.15915494, 2, 1 } };\n"
2837     "TEMP R0;\n"
2838     "TEMP R1;\n"
2839     "TEMP R2;\n"
2840     "TEMP R3;\n"
2841     "TEMP R4;\n"
2842     "MUL R0.xyz, fragment.position.y, c[2];\n"
2843     "MAD R0.xyz, fragment.position.x, c[1], R0;\n"
2844     "ADD R0.xyz, R0, c[3];\n"
2845     "RCP R0.z, R0.z;\n"
2846     "MUL R0.xy, R0, R0.z;\n"
2847     "ABS R0.z, R0.x;\n"
2848     "ABS R0.w, R0.y;\n"
2849     "ADD R0.w, R0, -R0.z;\n"
2850     "ADD R1.x, R0.y, c[8];\n"
2851     "ABS R0.w, R0;\n"
2852     "CMP R0.y, -R0.w, R0, R1.x;\n"
2853     "ABS R0.w, -R0.y;\n"
2854     "MAX R1.x, R0.z, R0.w;\n"
2855     "RCP R1.y, R1.x;\n"
2856     "MIN R1.x, R0.z, R0.w;\n"
2857     "MUL R1.x, R1, R1.y;\n"
2858     "MUL R1.y, R1.x, R1.x;\n"
2859     "MAD R1.z, R1.y, c[8].y, c[8];\n"
2860     "MAD R1.z, R1, R1.y, -c[8].w;\n"
2861     "MAD R1.z, R1, R1.y, c[9].x;\n"
2862     "MAD R1.z, R1, R1.y, -c[9].y;\n"
2863     "MAD R1.y, R1.z, R1, c[9].z;\n"
2864     "MUL R1.x, R1.y, R1;\n"
2865     "ADD R0.z, -R0, R0.w;\n"
2866     "ADD R1.y, -R1.x, c[9].w;\n"
2867     "CMP R0.z, -R0, R1.y, R1.x;\n"
2868     "ADD R0.w, -R0.z, c[10].x;\n"
2869     "CMP R0.x, R0, R0.w, R0.z;\n"
2870     "CMP R0.x, -R0.y, -R0, R0;\n"
2871     "ADD R0.x, R0, c[0];\n"
2872     "MUL R0.x, R0, c[10].y;\n"
2873     "FLR R0.y, R0.x;\n"
2874     "ADD R0.x, R0, -R0.y;\n"
2875     "TEX R0, R0, texture[2], 1D;\n"
2876     "MUL R1.xy, fragment.position, c[5];\n"
2877     "TEX R1, R1, texture[0], 2D;\n"
2878     "ADD R2.w, -R1, c[10];\n"
2879     "ADD R3.xyz, R0.w, -R0;\n"
2880     "ADD R2.xyz, R1.w, -R1;\n"
2881     "MUL R2.xyz, R2, R3;\n"
2882     "MUL R2.xyz, R2, c[10].z;\n"
2883     "MAD R2.xyz, R0.w, R1.w, -R2;\n"
2884     "MUL R4.xyz, R0, R2.w;\n"
2885     "MAD R2.xyz, R0, R2.w, R2;\n"
2886     "MUL R3.xyz, R0, R1;\n"
2887     "ADD R2.w, -R0, c[10];\n"
2888     "MAD R3.xyz, R3, c[10].z, R4;\n"
2889     "MUL R0.xyz, R0, c[10].z;\n"
2890     "SGE R0.xyz, R0, R0.w;\n"
2891     "MAD R3.xyz, R1, R2.w, R3;\n"
2892     "MAD R2.xyz, R1, R2.w, R2;\n"
2893     "ADD R2.xyz, R2, -R3;\n"
2894     "MAD R2.xyz, R0, R2, R3;\n"
2895     "ADD R0.z, R0.w, R1.w;\n"
2896     "MAD R2.w, -R0, R1, R0.z;\n"
2897     "ADD R0.xy, fragment.position, c[6];\n"
2898     "MUL R0.xy, R0, c[4];\n"
2899     "TEX R0, R0, texture[1], 2D;\n"
2900     "ADD R2, R2, -R1;\n"
2901     "DP4 R0.x, R0, c[7];\n"
2902     "MAD result.color, R0.x, R2, R1;\n"
2903     "END\n"
2904     ;
2905 
2906 static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_CONICAL_COMPOSITION_MODES_SOFTLIGHT =
2907     "!!ARBfp1.0\n"
2908     "PARAM c[13] = { program.local[0..7],\n"
2909     "		{ 0.0020000001, -0.01348047, 0.05747731, 0.1212391 },\n"
2910     "		{ 0.1956359, 0.33299461, 0.99999559, 1.570796 },\n"
2911     "		{ 3.141593, 0.15915494, 1, 2 },\n"
2912     "		{ 9.9999997e-006, 4, 16, 12 },\n"
2913     "		{ 3 } };\n"
2914     "TEMP R0;\n"
2915     "TEMP R1;\n"
2916     "TEMP R2;\n"
2917     "TEMP R3;\n"
2918     "TEMP R4;\n"
2919     "TEMP R5;\n"
2920     "TEMP R6;\n"
2921     "MUL R0.xyz, fragment.position.y, c[2];\n"
2922     "MAD R0.xyz, fragment.position.x, c[1], R0;\n"
2923     "ADD R0.xyz, R0, c[3];\n"
2924     "RCP R0.z, R0.z;\n"
2925     "MUL R0.xy, R0, R0.z;\n"
2926     "ABS R0.w, R0.x;\n"
2927     "ABS R0.z, R0.y;\n"
2928     "ADD R0.z, R0, -R0.w;\n"
2929     "ADD R1.x, R0.y, c[8];\n"
2930     "ABS R0.z, R0;\n"
2931     "CMP R0.y, -R0.z, R0, R1.x;\n"
2932     "ABS R0.z, -R0.y;\n"
2933     "MAX R1.x, R0.w, R0.z;\n"
2934     "RCP R1.y, R1.x;\n"
2935     "MIN R1.x, R0.w, R0.z;\n"
2936     "MUL R1.x, R1, R1.y;\n"
2937     "MUL R1.y, R1.x, R1.x;\n"
2938     "MAD R1.z, R1.y, c[8].y, c[8];\n"
2939     "MAD R1.z, R1, R1.y, -c[8].w;\n"
2940     "MAD R1.z, R1, R1.y, c[9].x;\n"
2941     "MAD R1.z, R1, R1.y, -c[9].y;\n"
2942     "MAD R1.y, R1.z, R1, c[9].z;\n"
2943     "MUL R1.x, R1.y, R1;\n"
2944     "ADD R1.y, -R1.x, c[9].w;\n"
2945     "ADD R0.z, -R0.w, R0;\n"
2946     "CMP R0.z, -R0, R1.y, R1.x;\n"
2947     "ADD R0.w, -R0.z, c[10].x;\n"
2948     "CMP R0.x, R0, R0.w, R0.z;\n"
2949     "MUL R0.zw, fragment.position.xyxy, c[5].xyxy;\n"
2950     "TEX R1, R0.zwzw, texture[0], 2D;\n"
2951     "CMP R0.x, -R0.y, -R0, R0;\n"
2952     "MAX R0.z, R1.w, c[11].x;\n"
2953     "RCP R2.x, R0.z;\n"
2954     "MUL R3.xyz, R1, R2.x;\n"
2955     "MAD R4.xyz, R3, c[11].z, -c[11].w;\n"
2956     "ADD R0.x, R0, c[0];\n"
2957     "MUL R0.x, R0, c[10].y;\n"
2958     "FLR R0.y, R0.x;\n"
2959     "ADD R0.x, R0, -R0.y;\n"
2960     "TEX R0, R0, texture[2], 1D;\n"
2961     "MAD R2.xyz, R0, c[10].w, -R0.w;\n"
2962     "MAD R4.xyz, R3, R4, c[12].x;\n"
2963     "MUL R5.xyz, R1.w, R2;\n"
2964     "MUL R6.xyz, R5, R4;\n"
2965     "RSQ R2.w, R3.x;\n"
2966     "RCP R4.x, R2.w;\n"
2967     "RSQ R2.w, R3.y;\n"
2968     "RSQ R3.w, R3.z;\n"
2969     "RCP R4.y, R2.w;\n"
2970     "RCP R4.z, R3.w;\n"
2971     "ADD R4.xyz, -R3, R4;\n"
2972     "MUL R6.xyz, R3, R6;\n"
2973     "MUL R4.xyz, R5, R4;\n"
2974     "ADD R3.xyz, -R3, c[10].z;\n"
2975     "MAD R2.xyz, R2, R3, R0.w;\n"
2976     "MUL R3.xyz, R0, c[10].w;\n"
2977     "MAD R5.xyz, R0.w, R1, R6;\n"
2978     "MAD R4.xyz, R0.w, R1, R4;\n"
2979     "ADD R6.xyz, R4, -R5;\n"
2980     "MUL R4.xyz, R1, c[11].y;\n"
2981     "SGE R4.xyz, R4, R1.w;\n"
2982     "MAD R4.xyz, R4, R6, R5;\n"
2983     "MAD R4.xyz, -R1, R2, R4;\n"
2984     "SGE R3.xyz, R3, R0.w;\n"
2985     "MUL R2.xyz, R1, R2;\n"
2986     "ADD R2.w, -R1, c[10].z;\n"
2987     "MAD R2.xyz, R3, R4, R2;\n"
2988     "MAD R2.xyz, R0, R2.w, R2;\n"
2989     "ADD R0.x, -R0.w, c[10].z;\n"
2990     "MAD R2.xyz, R1, R0.x, R2;\n"
2991     "ADD R0.z, R0.w, R1.w;\n"
2992     "MAD R2.w, -R0, R1, R0.z;\n"
2993     "ADD R0.xy, fragment.position, c[6];\n"
2994     "MUL R0.xy, R0, c[4];\n"
2995     "TEX R0, R0, texture[1], 2D;\n"
2996     "ADD R2, R2, -R1;\n"
2997     "DP4 R0.x, R0, c[7];\n"
2998     "MAD result.color, R0.x, R2, R1;\n"
2999     "END\n"
3000     ;
3001 
3002 static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_CONICAL_COMPOSITION_MODES_DIFFERENCE =
3003     "!!ARBfp1.0\n"
3004     "PARAM c[11] = { program.local[0..7],\n"
3005     "		{ 0.15915494, 0.0020000001, 3.141593, 1.570796 },\n"
3006     "		{ -0.01348047, 0.05747731, 0.1212391, 0.1956359 },\n"
3007     "		{ 0.33299461, 0.99999559, 2 } };\n"
3008     "TEMP R0;\n"
3009     "TEMP R1;\n"
3010     "TEMP R2;\n"
3011     "TEMP R3;\n"
3012     "MUL R0.xyz, fragment.position.y, c[2];\n"
3013     "MAD R0.xyz, fragment.position.x, c[1], R0;\n"
3014     "ADD R0.xyz, R0, c[3];\n"
3015     "RCP R0.z, R0.z;\n"
3016     "MUL R0.xy, R0, R0.z;\n"
3017     "ABS R0.z, R0.x;\n"
3018     "ABS R0.w, R0.y;\n"
3019     "ADD R0.w, R0, -R0.z;\n"
3020     "ADD R1.x, R0.y, c[8].y;\n"
3021     "ABS R0.w, R0;\n"
3022     "CMP R0.y, -R0.w, R0, R1.x;\n"
3023     "ABS R0.w, -R0.y;\n"
3024     "MAX R1.x, R0.z, R0.w;\n"
3025     "RCP R1.y, R1.x;\n"
3026     "MIN R1.x, R0.z, R0.w;\n"
3027     "MUL R1.x, R1, R1.y;\n"
3028     "MUL R1.y, R1.x, R1.x;\n"
3029     "MAD R1.z, R1.y, c[9].x, c[9].y;\n"
3030     "MAD R1.z, R1, R1.y, -c[9];\n"
3031     "MAD R1.z, R1, R1.y, c[9].w;\n"
3032     "MAD R1.z, R1, R1.y, -c[10].x;\n"
3033     "MAD R1.y, R1.z, R1, c[10];\n"
3034     "MUL R1.x, R1.y, R1;\n"
3035     "ADD R1.y, -R1.x, c[8].w;\n"
3036     "ADD R0.z, -R0, R0.w;\n"
3037     "CMP R0.z, -R0, R1.y, R1.x;\n"
3038     "ADD R0.w, -R0.z, c[8].z;\n"
3039     "CMP R0.x, R0, R0.w, R0.z;\n"
3040     "CMP R0.x, -R0.y, -R0, R0;\n"
3041     "ADD R0.x, R0, c[0];\n"
3042     "MUL R0.z, R0.x, c[8].x;\n"
3043     "FLR R0.w, R0.z;\n"
3044     "ADD R1.x, R0.z, -R0.w;\n"
3045     "MUL R0.xy, fragment.position, c[5];\n"
3046     "TEX R0, R0, texture[0], 2D;\n"
3047     "TEX R1, R1, texture[2], 1D;\n"
3048     "ADD R2.xyz, R1, R0;\n"
3049     "MUL R3.xyz, R1.w, R0;\n"
3050     "MUL R1.xyz, R1, R0.w;\n"
3051     "MIN R1.xyz, R1, R3;\n"
3052     "MAD R2.xyz, -R1, c[10].z, R2;\n"
3053     "ADD R1.z, R1.w, R0.w;\n"
3054     "MAD R2.w, -R1, R0, R1.z;\n"
3055     "ADD R1.xy, fragment.position, c[6];\n"
3056     "MUL R1.xy, R1, c[4];\n"
3057     "TEX R1, R1, texture[1], 2D;\n"
3058     "ADD R2, R2, -R0;\n"
3059     "DP4 R1.x, R1, c[7];\n"
3060     "MAD result.color, R1.x, R2, R0;\n"
3061     "END\n"
3062     ;
3063 
3064 static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_CONICAL_COMPOSITION_MODES_EXCLUSION =
3065     "!!ARBfp1.0\n"
3066     "PARAM c[11] = { program.local[0..7],\n"
3067     "		{ 0.15915494, 0.0020000001, 3.141593, 1.570796 },\n"
3068     "		{ -0.01348047, 0.05747731, 0.1212391, 0.1956359 },\n"
3069     "		{ 0.33299461, 0.99999559, 2, 1 } };\n"
3070     "TEMP R0;\n"
3071     "TEMP R1;\n"
3072     "TEMP R2;\n"
3073     "TEMP R3;\n"
3074     "MUL R0.xyz, fragment.position.y, c[2];\n"
3075     "MAD R0.xyz, fragment.position.x, c[1], R0;\n"
3076     "ADD R0.xyz, R0, c[3];\n"
3077     "RCP R0.z, R0.z;\n"
3078     "MUL R0.xy, R0, R0.z;\n"
3079     "ABS R0.z, R0.x;\n"
3080     "ABS R0.w, R0.y;\n"
3081     "ADD R0.w, R0, -R0.z;\n"
3082     "ADD R1.x, R0.y, c[8].y;\n"
3083     "ABS R0.w, R0;\n"
3084     "CMP R0.y, -R0.w, R0, R1.x;\n"
3085     "ABS R0.w, -R0.y;\n"
3086     "MAX R1.x, R0.z, R0.w;\n"
3087     "RCP R1.y, R1.x;\n"
3088     "MIN R1.x, R0.z, R0.w;\n"
3089     "MUL R1.x, R1, R1.y;\n"
3090     "MUL R1.y, R1.x, R1.x;\n"
3091     "MAD R1.z, R1.y, c[9].x, c[9].y;\n"
3092     "MAD R1.z, R1, R1.y, -c[9];\n"
3093     "MAD R1.z, R1, R1.y, c[9].w;\n"
3094     "MAD R1.z, R1, R1.y, -c[10].x;\n"
3095     "MAD R1.y, R1.z, R1, c[10];\n"
3096     "MUL R1.x, R1.y, R1;\n"
3097     "ADD R1.y, -R1.x, c[8].w;\n"
3098     "ADD R0.z, -R0, R0.w;\n"
3099     "CMP R0.z, -R0, R1.y, R1.x;\n"
3100     "ADD R0.w, -R0.z, c[8].z;\n"
3101     "CMP R0.x, R0, R0.w, R0.z;\n"
3102     "CMP R0.x, -R0.y, -R0, R0;\n"
3103     "ADD R0.x, R0, c[0];\n"
3104     "MUL R0.z, R0.x, c[8].x;\n"
3105     "FLR R0.w, R0.z;\n"
3106     "ADD R1.x, R0.z, -R0.w;\n"
3107     "MUL R0.xy, fragment.position, c[5];\n"
3108     "TEX R0, R0, texture[0], 2D;\n"
3109     "TEX R1, R1, texture[2], 1D;\n"
3110     "MUL R2.xyz, R1.w, R0;\n"
3111     "MAD R3.xyz, R1, R0.w, R2;\n"
3112     "MUL R2.xyz, R1, R0;\n"
3113     "MAD R2.xyz, -R2, c[10].z, R3;\n"
3114     "ADD R2.w, -R0, c[10];\n"
3115     "MAD R1.xyz, R1, R2.w, R2;\n"
3116     "ADD R2.x, -R1.w, c[10].w;\n"
3117     "MAD R2.xyz, R0, R2.x, R1;\n"
3118     "ADD R1.z, R1.w, R0.w;\n"
3119     "MAD R2.w, -R1, R0, R1.z;\n"
3120     "ADD R1.xy, fragment.position, c[6];\n"
3121     "MUL R1.xy, R1, c[4];\n"
3122     "TEX R1, R1, texture[1], 2D;\n"
3123     "ADD R2, R2, -R0;\n"
3124     "DP4 R1.x, R1, c[7];\n"
3125     "MAD result.color, R1.x, R2, R0;\n"
3126     "END\n"
3127     ;
3128 
3129 static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_CONICAL_COMPOSITION_MODES_SIMPLE_PORTER_DUFF_NOMASK =
3130     "!!ARBfp1.0\n"
3131     "PARAM c[10] = { program.local[0..6],\n"
3132     "		{ 0.15915494, 0.0020000001, 3.141593, 1.570796 },\n"
3133     "		{ -0.01348047, 0.05747731, 0.1212391, 0.1956359 },\n"
3134     "		{ 0.33299461, 0.99999559, 1 } };\n"
3135     "TEMP R0;\n"
3136     "TEMP R1;\n"
3137     "TEMP R2;\n"
3138     "TEMP R3;\n"
3139     "MUL R0.xyz, fragment.position.y, c[2];\n"
3140     "MAD R0.xyz, fragment.position.x, c[1], R0;\n"
3141     "ADD R0.xyz, R0, c[3];\n"
3142     "RCP R0.z, R0.z;\n"
3143     "MUL R0.xy, R0, R0.z;\n"
3144     "ABS R0.z, R0.x;\n"
3145     "ABS R0.w, R0.y;\n"
3146     "ADD R0.w, R0, -R0.z;\n"
3147     "ADD R1.x, R0.y, c[7].y;\n"
3148     "ABS R0.w, R0;\n"
3149     "CMP R0.y, -R0.w, R0, R1.x;\n"
3150     "ABS R0.w, -R0.y;\n"
3151     "MAX R1.x, R0.z, R0.w;\n"
3152     "RCP R1.y, R1.x;\n"
3153     "MIN R1.x, R0.z, R0.w;\n"
3154     "MUL R1.x, R1, R1.y;\n"
3155     "MUL R1.y, R1.x, R1.x;\n"
3156     "MAD R1.z, R1.y, c[8].x, c[8].y;\n"
3157     "MAD R1.z, R1, R1.y, -c[8];\n"
3158     "MAD R1.z, R1, R1.y, c[8].w;\n"
3159     "MAD R1.z, R1, R1.y, -c[9].x;\n"
3160     "MAD R1.y, R1.z, R1, c[9];\n"
3161     "MUL R1.x, R1.y, R1;\n"
3162     "ADD R0.z, -R0, R0.w;\n"
3163     "ADD R1.y, -R1.x, c[7].w;\n"
3164     "CMP R0.z, -R0, R1.y, R1.x;\n"
3165     "ADD R0.w, -R0.z, c[7].z;\n"
3166     "CMP R0.x, R0, R0.w, R0.z;\n"
3167     "CMP R0.x, -R0.y, -R0, R0;\n"
3168     "MUL R0.zw, fragment.position.xyxy, c[6].xyxy;\n"
3169     "TEX R1, R0.zwzw, texture[0], 2D;\n"
3170     "MUL R2.xyz, R1, c[4].y;\n"
3171     "ADD R0.x, R0, c[0];\n"
3172     "MUL R0.x, R0, c[7];\n"
3173     "FLR R0.y, R0.x;\n"
3174     "ADD R0.x, R0, -R0.y;\n"
3175     "TEX R0, R0, texture[1], 1D;\n"
3176     "MUL R3.xyz, R0.w, R2;\n"
3177     "MUL R2.xyz, R0, c[4].x;\n"
3178     "MAD R2.xyz, R1.w, R2, R3;\n"
3179     "ADD R2.w, -R1, c[9].z;\n"
3180     "MUL R0.xyz, R0, c[5].y;\n"
3181     "MAD R0.xyz, R2.w, R0, R2;\n"
3182     "ADD R2.x, -R0.w, c[9].z;\n"
3183     "MUL R1.xyz, R1, c[5].z;\n"
3184     "MAD result.color.xyz, R2.x, R1, R0;\n"
3185     "MUL R0.x, R0.w, R1.w;\n"
3186     "MUL R0.z, R1.w, R2.x;\n"
3187     "MUL R0.y, R0.w, R2.w;\n"
3188     "DP3 result.color.w, R0, c[5];\n"
3189     "END\n"
3190     ;
3191 
3192 static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_CONICAL_COMPOSITION_MODES_MULTIPLY_NOMASK =
3193     "!!ARBfp1.0\n"
3194     "PARAM c[8] = { program.local[0..4],\n"
3195     "		{ 0.15915494, 0.0020000001, 3.141593, 1.570796 },\n"
3196     "		{ -0.01348047, 0.05747731, 0.1212391, 0.1956359 },\n"
3197     "		{ 0.33299461, 0.99999559, 1 } };\n"
3198     "TEMP R0;\n"
3199     "TEMP R1;\n"
3200     "TEMP R2;\n"
3201     "MUL R0.xyz, fragment.position.y, c[2];\n"
3202     "MAD R0.xyz, fragment.position.x, c[1], R0;\n"
3203     "ADD R0.xyz, R0, c[3];\n"
3204     "RCP R0.z, R0.z;\n"
3205     "MUL R0.xy, R0, R0.z;\n"
3206     "ABS R0.z, R0.x;\n"
3207     "ABS R0.w, R0.y;\n"
3208     "ADD R0.w, R0, -R0.z;\n"
3209     "ADD R1.x, R0.y, c[5].y;\n"
3210     "ABS R0.w, R0;\n"
3211     "CMP R0.y, -R0.w, R0, R1.x;\n"
3212     "ABS R0.w, -R0.y;\n"
3213     "MAX R1.x, R0.z, R0.w;\n"
3214     "RCP R1.y, R1.x;\n"
3215     "MIN R1.x, R0.z, R0.w;\n"
3216     "MUL R1.x, R1, R1.y;\n"
3217     "MUL R1.y, R1.x, R1.x;\n"
3218     "MAD R1.z, R1.y, c[6].x, c[6].y;\n"
3219     "MAD R1.z, R1, R1.y, -c[6];\n"
3220     "MAD R1.z, R1, R1.y, c[6].w;\n"
3221     "MAD R1.z, R1, R1.y, -c[7].x;\n"
3222     "MAD R1.y, R1.z, R1, c[7];\n"
3223     "MUL R1.x, R1.y, R1;\n"
3224     "ADD R0.z, -R0, R0.w;\n"
3225     "ADD R1.y, -R1.x, c[5].w;\n"
3226     "CMP R0.z, -R0, R1.y, R1.x;\n"
3227     "ADD R0.w, -R0.z, c[5].z;\n"
3228     "CMP R0.x, R0, R0.w, R0.z;\n"
3229     "CMP R0.x, -R0.y, -R0, R0;\n"
3230     "MUL R0.zw, fragment.position.xyxy, c[4].xyxy;\n"
3231     "TEX R1, R0.zwzw, texture[0], 2D;\n"
3232     "ADD R0.x, R0, c[0];\n"
3233     "MUL R0.x, R0, c[5];\n"
3234     "FLR R0.y, R0.x;\n"
3235     "ADD R0.x, R0, -R0.y;\n"
3236     "TEX R0, R0, texture[1], 1D;\n"
3237     "ADD R2.x, -R1.w, c[7].z;\n"
3238     "MUL R2.xyz, R0, R2.x;\n"
3239     "MAD R0.xyz, R0, R1, R2;\n"
3240     "ADD R2.x, R0.w, R1.w;\n"
3241     "ADD R2.y, -R0.w, c[7].z;\n"
3242     "MAD result.color.xyz, R1, R2.y, R0;\n"
3243     "MAD result.color.w, -R0, R1, R2.x;\n"
3244     "END\n"
3245     ;
3246 
3247 static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_CONICAL_COMPOSITION_MODES_SCREEN_NOMASK =
3248     "!!ARBfp1.0\n"
3249     "PARAM c[8] = { program.local[0..4],\n"
3250     "		{ 0.15915494, 0.0020000001, 3.141593, 1.570796 },\n"
3251     "		{ -0.01348047, 0.05747731, 0.1212391, 0.1956359 },\n"
3252     "		{ 0.33299461, 0.99999559 } };\n"
3253     "TEMP R0;\n"
3254     "TEMP R1;\n"
3255     "TEMP R2;\n"
3256     "MUL R0.xyz, fragment.position.y, c[2];\n"
3257     "MAD R0.xyz, fragment.position.x, c[1], R0;\n"
3258     "ADD R0.xyz, R0, c[3];\n"
3259     "RCP R0.z, R0.z;\n"
3260     "MUL R0.xy, R0, R0.z;\n"
3261     "ABS R0.z, R0.x;\n"
3262     "ABS R0.w, R0.y;\n"
3263     "ADD R0.w, R0, -R0.z;\n"
3264     "ADD R1.x, R0.y, c[5].y;\n"
3265     "ABS R0.w, R0;\n"
3266     "CMP R0.y, -R0.w, R0, R1.x;\n"
3267     "ABS R0.w, -R0.y;\n"
3268     "MAX R1.x, R0.z, R0.w;\n"
3269     "RCP R1.y, R1.x;\n"
3270     "MIN R1.x, R0.z, R0.w;\n"
3271     "MUL R1.x, R1, R1.y;\n"
3272     "MUL R1.y, R1.x, R1.x;\n"
3273     "MAD R1.z, R1.y, c[6].x, c[6].y;\n"
3274     "MAD R1.z, R1, R1.y, -c[6];\n"
3275     "MAD R1.z, R1, R1.y, c[6].w;\n"
3276     "MAD R1.z, R1, R1.y, -c[7].x;\n"
3277     "MAD R1.y, R1.z, R1, c[7];\n"
3278     "MUL R1.x, R1.y, R1;\n"
3279     "ADD R0.z, -R0, R0.w;\n"
3280     "ADD R1.y, -R1.x, c[5].w;\n"
3281     "CMP R0.z, -R0, R1.y, R1.x;\n"
3282     "ADD R0.w, -R0.z, c[5].z;\n"
3283     "CMP R0.x, R0, R0.w, R0.z;\n"
3284     "CMP R0.x, -R0.y, -R0, R0;\n"
3285     "MUL R0.zw, fragment.position.xyxy, c[4].xyxy;\n"
3286     "ADD R0.x, R0, c[0];\n"
3287     "MUL R0.x, R0, c[5];\n"
3288     "FLR R0.y, R0.x;\n"
3289     "TEX R1, R0.zwzw, texture[0], 2D;\n"
3290     "ADD R0.x, R0, -R0.y;\n"
3291     "TEX R0, R0, texture[1], 1D;\n"
3292     "ADD R2, R0, R1;\n"
3293     "MAD result.color, -R0, R1, R2;\n"
3294     "END\n"
3295     ;
3296 
3297 static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_CONICAL_COMPOSITION_MODES_OVERLAY_NOMASK =
3298     "!!ARBfp1.0\n"
3299     "PARAM c[8] = { program.local[0..4],\n"
3300     "		{ 0.0020000001, -0.01348047, 0.05747731, 0.1212391 },\n"
3301     "		{ 0.1956359, 0.33299461, 0.99999559, 1.570796 },\n"
3302     "		{ 3.141593, 0.15915494, 2, 1 } };\n"
3303     "TEMP R0;\n"
3304     "TEMP R1;\n"
3305     "TEMP R2;\n"
3306     "TEMP R3;\n"
3307     "MUL R0.xyz, fragment.position.y, c[2];\n"
3308     "MAD R0.xyz, fragment.position.x, c[1], R0;\n"
3309     "ADD R0.xyz, R0, c[3];\n"
3310     "RCP R0.z, R0.z;\n"
3311     "MUL R0.xy, R0, R0.z;\n"
3312     "ABS R0.z, R0.x;\n"
3313     "ABS R0.w, R0.y;\n"
3314     "ADD R0.w, R0, -R0.z;\n"
3315     "ADD R1.x, R0.y, c[5];\n"
3316     "ABS R0.w, R0;\n"
3317     "CMP R0.y, -R0.w, R0, R1.x;\n"
3318     "ABS R0.w, -R0.y;\n"
3319     "MAX R1.x, R0.z, R0.w;\n"
3320     "RCP R1.y, R1.x;\n"
3321     "MIN R1.x, R0.z, R0.w;\n"
3322     "MUL R1.x, R1, R1.y;\n"
3323     "MUL R1.y, R1.x, R1.x;\n"
3324     "MAD R1.z, R1.y, c[5].y, c[5];\n"
3325     "MAD R1.z, R1, R1.y, -c[5].w;\n"
3326     "MAD R1.z, R1, R1.y, c[6].x;\n"
3327     "MAD R1.z, R1, R1.y, -c[6].y;\n"
3328     "MAD R1.y, R1.z, R1, c[6].z;\n"
3329     "MUL R1.x, R1.y, R1;\n"
3330     "ADD R0.z, -R0, R0.w;\n"
3331     "ADD R1.y, -R1.x, c[6].w;\n"
3332     "CMP R0.z, -R0, R1.y, R1.x;\n"
3333     "ADD R0.w, -R0.z, c[7].x;\n"
3334     "CMP R0.x, R0, R0.w, R0.z;\n"
3335     "CMP R0.x, -R0.y, -R0, R0;\n"
3336     "ADD R0.x, R0, c[0];\n"
3337     "MUL R0.x, R0, c[7].y;\n"
3338     "FLR R0.y, R0.x;\n"
3339     "ADD R0.x, R0, -R0.y;\n"
3340     "TEX R0, R0, texture[1], 1D;\n"
3341     "MUL R1.xy, fragment.position, c[4];\n"
3342     "TEX R1, R1, texture[0], 2D;\n"
3343     "ADD R3.xyz, R0.w, -R0;\n"
3344     "ADD R2.xyz, R1.w, -R1;\n"
3345     "MUL R2.xyz, R2, R3;\n"
3346     "ADD R2.w, -R1, c[7];\n"
3347     "MUL R2.xyz, R2, c[7].z;\n"
3348     "MAD R2.xyz, R0.w, R1.w, -R2;\n"
3349     "MAD R2.xyz, R0, R2.w, R2;\n"
3350     "MUL R3.xyz, R0, R2.w;\n"
3351     "MUL R0.xyz, R0, R1;\n"
3352     "ADD R2.w, -R0, c[7];\n"
3353     "MAD R0.xyz, R0, c[7].z, R3;\n"
3354     "MAD R0.xyz, R1, R2.w, R0;\n"
3355     "MAD R2.xyz, R1, R2.w, R2;\n"
3356     "MUL R1.xyz, R1, c[7].z;\n"
3357     "ADD R2.w, R0, R1;\n"
3358     "ADD R2.xyz, R2, -R0;\n"
3359     "SGE R1.xyz, R1, R1.w;\n"
3360     "MAD result.color.xyz, R1, R2, R0;\n"
3361     "MAD result.color.w, -R0, R1, R2;\n"
3362     "END\n"
3363     ;
3364 
3365 static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_CONICAL_COMPOSITION_MODES_DARKEN_NOMASK =
3366     "!!ARBfp1.0\n"
3367     "PARAM c[8] = { program.local[0..4],\n"
3368     "		{ 0.15915494, 0.0020000001, 3.141593, 1.570796 },\n"
3369     "		{ -0.01348047, 0.05747731, 0.1212391, 0.1956359 },\n"
3370     "		{ 0.33299461, 0.99999559, 1 } };\n"
3371     "TEMP R0;\n"
3372     "TEMP R1;\n"
3373     "TEMP R2;\n"
3374     "TEMP R3;\n"
3375     "MUL R0.xyz, fragment.position.y, c[2];\n"
3376     "MAD R0.xyz, fragment.position.x, c[1], R0;\n"
3377     "ADD R0.xyz, R0, c[3];\n"
3378     "RCP R0.z, R0.z;\n"
3379     "MUL R0.xy, R0, R0.z;\n"
3380     "ABS R0.z, R0.x;\n"
3381     "ABS R0.w, R0.y;\n"
3382     "ADD R0.w, R0, -R0.z;\n"
3383     "ADD R1.x, R0.y, c[5].y;\n"
3384     "ABS R0.w, R0;\n"
3385     "CMP R0.y, -R0.w, R0, R1.x;\n"
3386     "ABS R0.w, -R0.y;\n"
3387     "MAX R1.x, R0.z, R0.w;\n"
3388     "RCP R1.y, R1.x;\n"
3389     "MIN R1.x, R0.z, R0.w;\n"
3390     "MUL R1.x, R1, R1.y;\n"
3391     "MUL R1.y, R1.x, R1.x;\n"
3392     "MAD R1.z, R1.y, c[6].x, c[6].y;\n"
3393     "MAD R1.z, R1, R1.y, -c[6];\n"
3394     "MAD R1.z, R1, R1.y, c[6].w;\n"
3395     "MAD R1.z, R1, R1.y, -c[7].x;\n"
3396     "MAD R1.y, R1.z, R1, c[7];\n"
3397     "MUL R1.x, R1.y, R1;\n"
3398     "ADD R0.z, -R0, R0.w;\n"
3399     "ADD R1.y, -R1.x, c[5].w;\n"
3400     "CMP R0.z, -R0, R1.y, R1.x;\n"
3401     "ADD R0.w, -R0.z, c[5].z;\n"
3402     "CMP R0.x, R0, R0.w, R0.z;\n"
3403     "CMP R0.x, -R0.y, -R0, R0;\n"
3404     "MUL R0.zw, fragment.position.xyxy, c[4].xyxy;\n"
3405     "TEX R1, R0.zwzw, texture[0], 2D;\n"
3406     "ADD R0.x, R0, c[0];\n"
3407     "MUL R0.x, R0, c[5];\n"
3408     "FLR R0.y, R0.x;\n"
3409     "ADD R0.x, R0, -R0.y;\n"
3410     "TEX R0, R0, texture[1], 1D;\n"
3411     "MUL R2.xyz, R0, R1.w;\n"
3412     "MUL R3.xyz, R0.w, R1;\n"
3413     "MIN R2.xyz, R2, R3;\n"
3414     "ADD R2.w, -R1, c[7].z;\n"
3415     "MAD R0.xyz, R0, R2.w, R2;\n"
3416     "ADD R2.x, R0.w, R1.w;\n"
3417     "ADD R2.y, -R0.w, c[7].z;\n"
3418     "MAD result.color.xyz, R1, R2.y, R0;\n"
3419     "MAD result.color.w, -R0, R1, R2.x;\n"
3420     "END\n"
3421     ;
3422 
3423 static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_CONICAL_COMPOSITION_MODES_LIGHTEN_NOMASK =
3424     "!!ARBfp1.0\n"
3425     "PARAM c[8] = { program.local[0..4],\n"
3426     "		{ 0.15915494, 0.0020000001, 3.141593, 1.570796 },\n"
3427     "		{ -0.01348047, 0.05747731, 0.1212391, 0.1956359 },\n"
3428     "		{ 0.33299461, 0.99999559, 1 } };\n"
3429     "TEMP R0;\n"
3430     "TEMP R1;\n"
3431     "TEMP R2;\n"
3432     "TEMP R3;\n"
3433     "MUL R0.xyz, fragment.position.y, c[2];\n"
3434     "MAD R0.xyz, fragment.position.x, c[1], R0;\n"
3435     "ADD R0.xyz, R0, c[3];\n"
3436     "RCP R0.z, R0.z;\n"
3437     "MUL R0.xy, R0, R0.z;\n"
3438     "ABS R0.z, R0.x;\n"
3439     "ABS R0.w, R0.y;\n"
3440     "ADD R0.w, R0, -R0.z;\n"
3441     "ADD R1.x, R0.y, c[5].y;\n"
3442     "ABS R0.w, R0;\n"
3443     "CMP R0.y, -R0.w, R0, R1.x;\n"
3444     "ABS R0.w, -R0.y;\n"
3445     "MAX R1.x, R0.z, R0.w;\n"
3446     "RCP R1.y, R1.x;\n"
3447     "MIN R1.x, R0.z, R0.w;\n"
3448     "MUL R1.x, R1, R1.y;\n"
3449     "MUL R1.y, R1.x, R1.x;\n"
3450     "MAD R1.z, R1.y, c[6].x, c[6].y;\n"
3451     "MAD R1.z, R1, R1.y, -c[6];\n"
3452     "MAD R1.z, R1, R1.y, c[6].w;\n"
3453     "MAD R1.z, R1, R1.y, -c[7].x;\n"
3454     "MAD R1.y, R1.z, R1, c[7];\n"
3455     "MUL R1.x, R1.y, R1;\n"
3456     "ADD R0.z, -R0, R0.w;\n"
3457     "ADD R1.y, -R1.x, c[5].w;\n"
3458     "CMP R0.z, -R0, R1.y, R1.x;\n"
3459     "ADD R0.w, -R0.z, c[5].z;\n"
3460     "CMP R0.x, R0, R0.w, R0.z;\n"
3461     "CMP R0.x, -R0.y, -R0, R0;\n"
3462     "MUL R0.zw, fragment.position.xyxy, c[4].xyxy;\n"
3463     "TEX R1, R0.zwzw, texture[0], 2D;\n"
3464     "ADD R0.x, R0, c[0];\n"
3465     "MUL R0.x, R0, c[5];\n"
3466     "FLR R0.y, R0.x;\n"
3467     "ADD R0.x, R0, -R0.y;\n"
3468     "TEX R0, R0, texture[1], 1D;\n"
3469     "MUL R2.xyz, R0, R1.w;\n"
3470     "MUL R3.xyz, R0.w, R1;\n"
3471     "MAX R2.xyz, R2, R3;\n"
3472     "ADD R2.w, -R1, c[7].z;\n"
3473     "MAD R0.xyz, R0, R2.w, R2;\n"
3474     "ADD R2.x, R0.w, R1.w;\n"
3475     "ADD R2.y, -R0.w, c[7].z;\n"
3476     "MAD result.color.xyz, R1, R2.y, R0;\n"
3477     "MAD result.color.w, -R0, R1, R2.x;\n"
3478     "END\n"
3479     ;
3480 
3481 static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_CONICAL_COMPOSITION_MODES_COLORDODGE_NOMASK =
3482     "!!ARBfp1.0\n"
3483     "PARAM c[8] = { program.local[0..4],\n"
3484     "		{ 0.0020000001, -0.01348047, 0.05747731, 0.1212391 },\n"
3485     "		{ 0.1956359, 0.33299461, 0.99999559, 1.570796 },\n"
3486     "		{ 3.141593, 0.15915494, 1, 1e-006 } };\n"
3487     "TEMP R0;\n"
3488     "TEMP R1;\n"
3489     "TEMP R2;\n"
3490     "TEMP R3;\n"
3491     "MUL R0.xyz, fragment.position.y, c[2];\n"
3492     "MAD R0.xyz, fragment.position.x, c[1], R0;\n"
3493     "ADD R0.xyz, R0, c[3];\n"
3494     "RCP R0.z, R0.z;\n"
3495     "MUL R0.xy, R0, R0.z;\n"
3496     "ABS R0.z, R0.x;\n"
3497     "ABS R0.w, R0.y;\n"
3498     "ADD R0.w, R0, -R0.z;\n"
3499     "ADD R1.x, R0.y, c[5];\n"
3500     "ABS R0.w, R0;\n"
3501     "CMP R0.y, -R0.w, R0, R1.x;\n"
3502     "ABS R0.w, -R0.y;\n"
3503     "MAX R1.x, R0.z, R0.w;\n"
3504     "RCP R1.y, R1.x;\n"
3505     "MIN R1.x, R0.z, R0.w;\n"
3506     "MUL R1.x, R1, R1.y;\n"
3507     "MUL R1.y, R1.x, R1.x;\n"
3508     "MAD R1.z, R1.y, c[5].y, c[5];\n"
3509     "MAD R1.z, R1, R1.y, -c[5].w;\n"
3510     "MAD R1.z, R1, R1.y, c[6].x;\n"
3511     "MAD R1.z, R1, R1.y, -c[6].y;\n"
3512     "MAD R1.y, R1.z, R1, c[6].z;\n"
3513     "MUL R1.x, R1.y, R1;\n"
3514     "ADD R1.y, -R1.x, c[6].w;\n"
3515     "ADD R0.z, -R0, R0.w;\n"
3516     "CMP R0.z, -R0, R1.y, R1.x;\n"
3517     "ADD R0.w, -R0.z, c[7].x;\n"
3518     "CMP R0.x, R0, R0.w, R0.z;\n"
3519     "CMP R0.x, -R0.y, -R0, R0;\n"
3520     "ADD R0.x, R0, c[0];\n"
3521     "MUL R0.x, R0, c[7].y;\n"
3522     "FLR R0.y, R0.x;\n"
3523     "ADD R0.x, R0, -R0.y;\n"
3524     "TEX R0, R0, texture[1], 1D;\n"
3525     "MAX R1.x, R0.w, c[7].w;\n"
3526     "RCP R1.x, R1.x;\n"
3527     "MAD R1.xyz, -R0, R1.x, c[7].z;\n"
3528     "MAX R2.xyz, R1, c[7].w;\n"
3529     "MUL R1.xy, fragment.position, c[4];\n"
3530     "TEX R1, R1, texture[0], 2D;\n"
3531     "ADD R2.w, -R0, c[7].z;\n"
3532     "MUL R3.xyz, R1, R2.w;\n"
3533     "ADD R2.w, -R1, c[7].z;\n"
3534     "MAD R3.xyz, R0, R2.w, R3;\n"
3535     "MUL R1.xyz, R0.w, R1;\n"
3536     "MAD R0.xyz, R0, R1.w, R1;\n"
3537     "MUL R2.w, R0, R1;\n"
3538     "RCP R2.x, R2.x;\n"
3539     "RCP R2.y, R2.y;\n"
3540     "RCP R2.z, R2.z;\n"
3541     "MAD R2.xyz, R1, R2, R3;\n"
3542     "MAD R3.xyz, R0.w, R1.w, R3;\n"
3543     "ADD R1.x, R0.w, R1.w;\n"
3544     "ADD R3.xyz, R3, -R2;\n"
3545     "SGE R0.xyz, R0, R2.w;\n"
3546     "MAD result.color.xyz, R0, R3, R2;\n"
3547     "MAD result.color.w, -R0, R1, R1.x;\n"
3548     "END\n"
3549     ;
3550 
3551 static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_CONICAL_COMPOSITION_MODES_COLORBURN_NOMASK =
3552     "!!ARBfp1.0\n"
3553     "PARAM c[8] = { program.local[0..4],\n"
3554     "		{ 0.0020000001, -0.01348047, 0.05747731, 0.1212391 },\n"
3555     "		{ 0.1956359, 0.33299461, 0.99999559, 1.570796 },\n"
3556     "		{ 3.141593, 0.15915494, 1, 9.9999997e-006 } };\n"
3557     "TEMP R0;\n"
3558     "TEMP R1;\n"
3559     "TEMP R2;\n"
3560     "TEMP R3;\n"
3561     "TEMP R4;\n"
3562     "TEMP R5;\n"
3563     "MUL R0.xyz, fragment.position.y, c[2];\n"
3564     "MAD R0.xyz, fragment.position.x, c[1], R0;\n"
3565     "ADD R0.xyz, R0, c[3];\n"
3566     "RCP R0.z, R0.z;\n"
3567     "MUL R0.xy, R0, R0.z;\n"
3568     "ABS R0.w, R0.x;\n"
3569     "ABS R0.z, R0.y;\n"
3570     "ADD R0.z, R0, -R0.w;\n"
3571     "ADD R1.x, R0.y, c[5];\n"
3572     "ABS R0.z, R0;\n"
3573     "CMP R0.y, -R0.z, R0, R1.x;\n"
3574     "ABS R0.z, -R0.y;\n"
3575     "MAX R1.x, R0.w, R0.z;\n"
3576     "RCP R1.y, R1.x;\n"
3577     "MIN R1.x, R0.w, R0.z;\n"
3578     "MUL R1.x, R1, R1.y;\n"
3579     "MUL R1.y, R1.x, R1.x;\n"
3580     "MAD R1.z, R1.y, c[5].y, c[5];\n"
3581     "MAD R1.z, R1, R1.y, -c[5].w;\n"
3582     "MAD R1.z, R1, R1.y, c[6].x;\n"
3583     "MAD R1.z, R1, R1.y, -c[6].y;\n"
3584     "MAD R1.y, R1.z, R1, c[6].z;\n"
3585     "MUL R1.x, R1.y, R1;\n"
3586     "ADD R1.y, -R1.x, c[6].w;\n"
3587     "ADD R0.z, -R0.w, R0;\n"
3588     "CMP R0.z, -R0, R1.y, R1.x;\n"
3589     "ADD R0.w, -R0.z, c[7].x;\n"
3590     "CMP R0.x, R0, R0.w, R0.z;\n"
3591     "CMP R0.x, -R0.y, -R0, R0;\n"
3592     "MUL R0.zw, fragment.position.xyxy, c[4].xyxy;\n"
3593     "TEX R1, R0.zwzw, texture[0], 2D;\n"
3594     "ADD R0.x, R0, c[0];\n"
3595     "MUL R0.x, R0, c[7].y;\n"
3596     "FLR R0.y, R0.x;\n"
3597     "ADD R0.x, R0, -R0.y;\n"
3598     "TEX R0, R0, texture[1], 1D;\n"
3599     "MUL R2.xyz, R0.w, R1;\n"
3600     "MAD R3.xyz, R0, R1.w, R2;\n"
3601     "ADD R2.w, -R1, c[7].z;\n"
3602     "MAD R2.xyz, -R0.w, R1.w, R3;\n"
3603     "MUL R4.xyz, R0.w, R2;\n"
3604     "MAX R2.xyz, R0, c[7].w;\n"
3605     "MUL R5.xyz, R0, R2.w;\n"
3606     "ADD R3.w, -R0, c[7].z;\n"
3607     "RCP R2.x, R2.x;\n"
3608     "RCP R2.y, R2.y;\n"
3609     "RCP R2.z, R2.z;\n"
3610     "MAD R2.xyz, R4, R2, R5;\n"
3611     "MUL R4.xyz, R1, R3.w;\n"
3612     "MAD R1.xyz, R1, R3.w, R2;\n"
3613     "MAD R0.xyz, R0, R2.w, R4;\n"
3614     "MUL R2.x, R0.w, R1.w;\n"
3615     "ADD R2.w, R0, R1;\n"
3616     "ADD R1.xyz, R1, -R0;\n"
3617     "SGE R2.xyz, R3, R2.x;\n"
3618     "MAD result.color.xyz, R2, R1, R0;\n"
3619     "MAD result.color.w, -R0, R1, R2;\n"
3620     "END\n"
3621     ;
3622 
3623 static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_CONICAL_COMPOSITION_MODES_HARDLIGHT_NOMASK =
3624     "!!ARBfp1.0\n"
3625     "PARAM c[8] = { program.local[0..4],\n"
3626     "		{ 0.0020000001, -0.01348047, 0.05747731, 0.1212391 },\n"
3627     "		{ 0.1956359, 0.33299461, 0.99999559, 1.570796 },\n"
3628     "		{ 3.141593, 0.15915494, 2, 1 } };\n"
3629     "TEMP R0;\n"
3630     "TEMP R1;\n"
3631     "TEMP R2;\n"
3632     "TEMP R3;\n"
3633     "TEMP R4;\n"
3634     "MUL R0.xyz, fragment.position.y, c[2];\n"
3635     "MAD R0.xyz, fragment.position.x, c[1], R0;\n"
3636     "ADD R0.xyz, R0, c[3];\n"
3637     "RCP R0.z, R0.z;\n"
3638     "MUL R0.xy, R0, R0.z;\n"
3639     "ABS R0.z, R0.x;\n"
3640     "ABS R0.w, R0.y;\n"
3641     "ADD R0.w, R0, -R0.z;\n"
3642     "ADD R1.x, R0.y, c[5];\n"
3643     "ABS R0.w, R0;\n"
3644     "CMP R0.y, -R0.w, R0, R1.x;\n"
3645     "ABS R0.w, -R0.y;\n"
3646     "MAX R1.x, R0.z, R0.w;\n"
3647     "RCP R1.y, R1.x;\n"
3648     "MIN R1.x, R0.z, R0.w;\n"
3649     "MUL R1.x, R1, R1.y;\n"
3650     "MUL R1.y, R1.x, R1.x;\n"
3651     "MAD R1.z, R1.y, c[5].y, c[5];\n"
3652     "MAD R1.z, R1, R1.y, -c[5].w;\n"
3653     "MAD R1.z, R1, R1.y, c[6].x;\n"
3654     "MAD R1.z, R1, R1.y, -c[6].y;\n"
3655     "MAD R1.y, R1.z, R1, c[6].z;\n"
3656     "MUL R1.x, R1.y, R1;\n"
3657     "ADD R0.z, -R0, R0.w;\n"
3658     "ADD R1.y, -R1.x, c[6].w;\n"
3659     "CMP R0.z, -R0, R1.y, R1.x;\n"
3660     "ADD R0.w, -R0.z, c[7].x;\n"
3661     "CMP R0.x, R0, R0.w, R0.z;\n"
3662     "CMP R0.x, -R0.y, -R0, R0;\n"
3663     "ADD R0.x, R0, c[0];\n"
3664     "MUL R0.x, R0, c[7].y;\n"
3665     "FLR R0.y, R0.x;\n"
3666     "ADD R0.x, R0, -R0.y;\n"
3667     "TEX R0, R0, texture[1], 1D;\n"
3668     "MUL R1.xy, fragment.position, c[4];\n"
3669     "TEX R1, R1, texture[0], 2D;\n"
3670     "ADD R2.w, -R1, c[7];\n"
3671     "ADD R3.xyz, R0.w, -R0;\n"
3672     "ADD R2.xyz, R1.w, -R1;\n"
3673     "MUL R2.xyz, R2, R3;\n"
3674     "MUL R2.xyz, R2, c[7].z;\n"
3675     "MAD R2.xyz, R0.w, R1.w, -R2;\n"
3676     "MUL R4.xyz, R0, R2.w;\n"
3677     "MUL R3.xyz, R0, R1;\n"
3678     "MAD R2.xyz, R0, R2.w, R2;\n"
3679     "ADD R2.w, -R0, c[7];\n"
3680     "MUL R0.xyz, R0, c[7].z;\n"
3681     "MAD R2.xyz, R1, R2.w, R2;\n"
3682     "MAD R3.xyz, R3, c[7].z, R4;\n"
3683     "MAD R1.xyz, R1, R2.w, R3;\n"
3684     "ADD R2.w, R0, R1;\n"
3685     "ADD R2.xyz, R2, -R1;\n"
3686     "SGE R0.xyz, R0, R0.w;\n"
3687     "MAD result.color.xyz, R0, R2, R1;\n"
3688     "MAD result.color.w, -R0, R1, R2;\n"
3689     "END\n"
3690     ;
3691 
3692 static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_CONICAL_COMPOSITION_MODES_SOFTLIGHT_NOMASK =
3693     "!!ARBfp1.0\n"
3694     "PARAM c[10] = { program.local[0..4],\n"
3695     "		{ 0.0020000001, -0.01348047, 0.05747731, 0.1212391 },\n"
3696     "		{ 0.1956359, 0.33299461, 0.99999559, 1.570796 },\n"
3697     "		{ 3.141593, 0.15915494, 1, 2 },\n"
3698     "		{ 9.9999997e-006, 4, 16, 12 },\n"
3699     "		{ 3 } };\n"
3700     "TEMP R0;\n"
3701     "TEMP R1;\n"
3702     "TEMP R2;\n"
3703     "TEMP R3;\n"
3704     "TEMP R4;\n"
3705     "TEMP R5;\n"
3706     "TEMP R6;\n"
3707     "MUL R0.xyz, fragment.position.y, c[2];\n"
3708     "MAD R0.xyz, fragment.position.x, c[1], R0;\n"
3709     "ADD R0.xyz, R0, c[3];\n"
3710     "RCP R0.z, R0.z;\n"
3711     "MUL R0.xy, R0, R0.z;\n"
3712     "ABS R0.w, R0.x;\n"
3713     "ABS R0.z, R0.y;\n"
3714     "ADD R0.z, R0, -R0.w;\n"
3715     "ADD R1.x, R0.y, c[5];\n"
3716     "ABS R0.z, R0;\n"
3717     "CMP R0.y, -R0.z, R0, R1.x;\n"
3718     "ABS R0.z, -R0.y;\n"
3719     "MAX R1.x, R0.w, R0.z;\n"
3720     "RCP R1.y, R1.x;\n"
3721     "MIN R1.x, R0.w, R0.z;\n"
3722     "MUL R1.x, R1, R1.y;\n"
3723     "MUL R1.y, R1.x, R1.x;\n"
3724     "MAD R1.z, R1.y, c[5].y, c[5];\n"
3725     "MAD R1.z, R1, R1.y, -c[5].w;\n"
3726     "MAD R1.z, R1, R1.y, c[6].x;\n"
3727     "MAD R1.z, R1, R1.y, -c[6].y;\n"
3728     "MAD R1.y, R1.z, R1, c[6].z;\n"
3729     "MUL R1.x, R1.y, R1;\n"
3730     "ADD R1.y, -R1.x, c[6].w;\n"
3731     "ADD R0.z, -R0.w, R0;\n"
3732     "CMP R0.z, -R0, R1.y, R1.x;\n"
3733     "ADD R0.w, -R0.z, c[7].x;\n"
3734     "CMP R0.x, R0, R0.w, R0.z;\n"
3735     "MUL R0.zw, fragment.position.xyxy, c[4].xyxy;\n"
3736     "TEX R1, R0.zwzw, texture[0], 2D;\n"
3737     "CMP R0.x, -R0.y, -R0, R0;\n"
3738     "MAX R0.z, R1.w, c[8].x;\n"
3739     "RCP R2.x, R0.z;\n"
3740     "MUL R3.xyz, R1, R2.x;\n"
3741     "MAD R4.xyz, R3, c[8].z, -c[8].w;\n"
3742     "ADD R0.x, R0, c[0];\n"
3743     "MUL R0.x, R0, c[7].y;\n"
3744     "FLR R0.y, R0.x;\n"
3745     "ADD R0.x, R0, -R0.y;\n"
3746     "TEX R0, R0, texture[1], 1D;\n"
3747     "MAD R2.xyz, R0, c[7].w, -R0.w;\n"
3748     "MAD R4.xyz, R3, R4, c[9].x;\n"
3749     "MUL R5.xyz, R1.w, R2;\n"
3750     "MUL R6.xyz, R5, R4;\n"
3751     "RSQ R2.w, R3.x;\n"
3752     "RCP R4.x, R2.w;\n"
3753     "RSQ R2.w, R3.y;\n"
3754     "RSQ R3.w, R3.z;\n"
3755     "RCP R4.y, R2.w;\n"
3756     "RCP R4.z, R3.w;\n"
3757     "ADD R4.xyz, -R3, R4;\n"
3758     "MUL R6.xyz, R3, R6;\n"
3759     "MUL R4.xyz, R5, R4;\n"
3760     "ADD R3.xyz, -R3, c[7].z;\n"
3761     "MAD R2.xyz, R2, R3, R0.w;\n"
3762     "MUL R3.xyz, R0, c[7].w;\n"
3763     "MAD R5.xyz, R0.w, R1, R6;\n"
3764     "MAD R4.xyz, R0.w, R1, R4;\n"
3765     "ADD R6.xyz, R4, -R5;\n"
3766     "MUL R4.xyz, R1, c[8].y;\n"
3767     "SGE R4.xyz, R4, R1.w;\n"
3768     "MAD R4.xyz, R4, R6, R5;\n"
3769     "MAD R4.xyz, -R1, R2, R4;\n"
3770     "MUL R2.xyz, R1, R2;\n"
3771     "SGE R3.xyz, R3, R0.w;\n"
3772     "MAD R2.xyz, R3, R4, R2;\n"
3773     "ADD R2.w, -R1, c[7].z;\n"
3774     "MAD R2.xyz, R0, R2.w, R2;\n"
3775     "ADD R0.x, R0.w, R1.w;\n"
3776     "ADD R0.y, -R0.w, c[7].z;\n"
3777     "MAD result.color.xyz, R1, R0.y, R2;\n"
3778     "MAD result.color.w, -R0, R1, R0.x;\n"
3779     "END\n"
3780     ;
3781 
3782 static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_CONICAL_COMPOSITION_MODES_DIFFERENCE_NOMASK =
3783     "!!ARBfp1.0\n"
3784     "PARAM c[8] = { program.local[0..4],\n"
3785     "		{ 0.15915494, 0.0020000001, 3.141593, 1.570796 },\n"
3786     "		{ -0.01348047, 0.05747731, 0.1212391, 0.1956359 },\n"
3787     "		{ 0.33299461, 0.99999559, 2 } };\n"
3788     "TEMP R0;\n"
3789     "TEMP R1;\n"
3790     "TEMP R2;\n"
3791     "TEMP R3;\n"
3792     "MUL R0.xyz, fragment.position.y, c[2];\n"
3793     "MAD R0.xyz, fragment.position.x, c[1], R0;\n"
3794     "ADD R0.xyz, R0, c[3];\n"
3795     "RCP R0.z, R0.z;\n"
3796     "MUL R0.xy, R0, R0.z;\n"
3797     "ABS R0.z, R0.x;\n"
3798     "ABS R0.w, R0.y;\n"
3799     "ADD R0.w, R0, -R0.z;\n"
3800     "ADD R1.x, R0.y, c[5].y;\n"
3801     "ABS R0.w, R0;\n"
3802     "CMP R0.y, -R0.w, R0, R1.x;\n"
3803     "ABS R0.w, -R0.y;\n"
3804     "MAX R1.x, R0.z, R0.w;\n"
3805     "RCP R1.y, R1.x;\n"
3806     "MIN R1.x, R0.z, R0.w;\n"
3807     "MUL R1.x, R1, R1.y;\n"
3808     "MUL R1.y, R1.x, R1.x;\n"
3809     "MAD R1.z, R1.y, c[6].x, c[6].y;\n"
3810     "MAD R1.z, R1, R1.y, -c[6];\n"
3811     "MAD R1.z, R1, R1.y, c[6].w;\n"
3812     "MAD R1.z, R1, R1.y, -c[7].x;\n"
3813     "MAD R1.y, R1.z, R1, c[7];\n"
3814     "MUL R1.x, R1.y, R1;\n"
3815     "ADD R0.z, -R0, R0.w;\n"
3816     "ADD R1.y, -R1.x, c[5].w;\n"
3817     "CMP R0.z, -R0, R1.y, R1.x;\n"
3818     "ADD R0.w, -R0.z, c[5].z;\n"
3819     "CMP R0.x, R0, R0.w, R0.z;\n"
3820     "CMP R0.x, -R0.y, -R0, R0;\n"
3821     "MUL R0.zw, fragment.position.xyxy, c[4].xyxy;\n"
3822     "ADD R0.x, R0, c[0];\n"
3823     "MUL R0.x, R0, c[5];\n"
3824     "FLR R0.y, R0.x;\n"
3825     "TEX R1, R0.zwzw, texture[0], 2D;\n"
3826     "ADD R0.x, R0, -R0.y;\n"
3827     "TEX R0, R0, texture[1], 1D;\n"
3828     "MUL R2.xyz, R0, R1.w;\n"
3829     "MUL R3.xyz, R0.w, R1;\n"
3830     "ADD R0.xyz, R0, R1;\n"
3831     "MIN R2.xyz, R2, R3;\n"
3832     "ADD R1.x, R0.w, R1.w;\n"
3833     "MAD result.color.xyz, -R2, c[7].z, R0;\n"
3834     "MAD result.color.w, -R0, R1, R1.x;\n"
3835     "END\n"
3836     ;
3837 
3838 static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_CONICAL_COMPOSITION_MODES_EXCLUSION_NOMASK =
3839     "!!ARBfp1.0\n"
3840     "PARAM c[8] = { program.local[0..4],\n"
3841     "		{ 0.15915494, 0.0020000001, 3.141593, 1.570796 },\n"
3842     "		{ -0.01348047, 0.05747731, 0.1212391, 0.1956359 },\n"
3843     "		{ 0.33299461, 0.99999559, 2, 1 } };\n"
3844     "TEMP R0;\n"
3845     "TEMP R1;\n"
3846     "TEMP R2;\n"
3847     "TEMP R3;\n"
3848     "MUL R0.xyz, fragment.position.y, c[2];\n"
3849     "MAD R0.xyz, fragment.position.x, c[1], R0;\n"
3850     "ADD R0.xyz, R0, c[3];\n"
3851     "RCP R0.z, R0.z;\n"
3852     "MUL R0.xy, R0, R0.z;\n"
3853     "ABS R0.z, R0.x;\n"
3854     "ABS R0.w, R0.y;\n"
3855     "ADD R0.w, R0, -R0.z;\n"
3856     "ADD R1.x, R0.y, c[5].y;\n"
3857     "ABS R0.w, R0;\n"
3858     "CMP R0.y, -R0.w, R0, R1.x;\n"
3859     "ABS R0.w, -R0.y;\n"
3860     "MAX R1.x, R0.z, R0.w;\n"
3861     "RCP R1.y, R1.x;\n"
3862     "MIN R1.x, R0.z, R0.w;\n"
3863     "MUL R1.x, R1, R1.y;\n"
3864     "MUL R1.y, R1.x, R1.x;\n"
3865     "MAD R1.z, R1.y, c[6].x, c[6].y;\n"
3866     "MAD R1.z, R1, R1.y, -c[6];\n"
3867     "MAD R1.z, R1, R1.y, c[6].w;\n"
3868     "MAD R1.z, R1, R1.y, -c[7].x;\n"
3869     "MAD R1.y, R1.z, R1, c[7];\n"
3870     "MUL R1.x, R1.y, R1;\n"
3871     "ADD R0.z, -R0, R0.w;\n"
3872     "ADD R1.y, -R1.x, c[5].w;\n"
3873     "CMP R0.z, -R0, R1.y, R1.x;\n"
3874     "ADD R0.w, -R0.z, c[5].z;\n"
3875     "CMP R0.x, R0, R0.w, R0.z;\n"
3876     "CMP R0.x, -R0.y, -R0, R0;\n"
3877     "MUL R0.zw, fragment.position.xyxy, c[4].xyxy;\n"
3878     "TEX R1, R0.zwzw, texture[0], 2D;\n"
3879     "ADD R0.x, R0, c[0];\n"
3880     "MUL R0.x, R0, c[5];\n"
3881     "FLR R0.y, R0.x;\n"
3882     "ADD R0.x, R0, -R0.y;\n"
3883     "TEX R0, R0, texture[1], 1D;\n"
3884     "MUL R2.xyz, R0.w, R1;\n"
3885     "MAD R3.xyz, R0, R1.w, R2;\n"
3886     "MUL R2.xyz, R0, R1;\n"
3887     "MAD R2.xyz, -R2, c[7].z, R3;\n"
3888     "ADD R2.w, -R1, c[7];\n"
3889     "MAD R0.xyz, R0, R2.w, R2;\n"
3890     "ADD R2.x, R0.w, R1.w;\n"
3891     "ADD R2.y, -R0.w, c[7].w;\n"
3892     "MAD result.color.xyz, R1, R2.y, R0;\n"
3893     "MAD result.color.w, -R0, R1, R2.x;\n"
3894     "END\n"
3895     ;
3896 
3897 static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_CONICAL_COMPOSITION_MODE_BLEND_MODE_MASK =
3898     "!!ARBfp1.0\n"
3899     "PARAM c[10] = { program.local[0..6],\n"
3900     "		{ 0.15915494, 0.0020000001, 3.141593, 1.570796 },\n"
3901     "		{ -0.01348047, 0.05747731, 0.1212391, 0.1956359 },\n"
3902     "		{ 0.33299461, 0.99999559 } };\n"
3903     "TEMP R0;\n"
3904     "TEMP R1;\n"
3905     "MUL R0.xyz, fragment.position.y, c[2];\n"
3906     "MAD R0.xyz, fragment.position.x, c[1], R0;\n"
3907     "ADD R0.xyz, R0, c[3];\n"
3908     "RCP R0.z, R0.z;\n"
3909     "MUL R0.xy, R0, R0.z;\n"
3910     "ABS R0.z, R0.x;\n"
3911     "ABS R0.w, R0.y;\n"
3912     "ADD R0.w, R0, -R0.z;\n"
3913     "ADD R1.x, R0.y, c[7].y;\n"
3914     "ABS R0.w, R0;\n"
3915     "CMP R0.y, -R0.w, R0, R1.x;\n"
3916     "ABS R0.w, -R0.y;\n"
3917     "MAX R1.x, R0.z, R0.w;\n"
3918     "RCP R1.y, R1.x;\n"
3919     "MIN R1.x, R0.z, R0.w;\n"
3920     "MUL R1.x, R1, R1.y;\n"
3921     "MUL R1.y, R1.x, R1.x;\n"
3922     "MAD R1.z, R1.y, c[8].x, c[8].y;\n"
3923     "MAD R1.z, R1, R1.y, -c[8];\n"
3924     "MAD R1.z, R1, R1.y, c[8].w;\n"
3925     "MAD R1.z, R1, R1.y, -c[9].x;\n"
3926     "MAD R1.y, R1.z, R1, c[9];\n"
3927     "MUL R1.x, R1.y, R1;\n"
3928     "ADD R1.y, -R1.x, c[7].w;\n"
3929     "ADD R0.z, -R0, R0.w;\n"
3930     "CMP R0.z, -R0, R1.y, R1.x;\n"
3931     "ADD R0.w, -R0.z, c[7].z;\n"
3932     "CMP R0.x, R0, R0.w, R0.z;\n"
3933     "CMP R0.x, -R0.y, -R0, R0;\n"
3934     "ADD R0.x, R0, c[0];\n"
3935     "MUL R1.x, R0, c[7];\n"
3936     "FLR R1.y, R1.x;\n"
3937     "ADD R0.zw, fragment.position.xyxy, c[5].xyxy;\n"
3938     "MUL R0.xy, R0.zwzw, c[4];\n"
3939     "TEX R0, R0, texture[0], 2D;\n"
3940     "ADD R1.x, R1, -R1.y;\n"
3941     "DP4 R1.y, R0, c[6];\n"
3942     "TEX R0, R1, texture[1], 1D;\n"
3943     "MUL result.color, R0, R1.y;\n"
3944     "END\n"
3945     ;
3946 
3947 static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_CONICAL_COMPOSITION_MODE_BLEND_MODE_NOMASK =
3948     "!!ARBfp1.0\n"
3949     "PARAM c[7] = { program.local[0..3],\n"
3950     "		{ 0.15915494, 0.0020000001, 3.141593, 1.570796 },\n"
3951     "		{ -0.01348047, 0.05747731, 0.1212391, 0.1956359 },\n"
3952     "		{ 0.33299461, 0.99999559 } };\n"
3953     "TEMP R0;\n"
3954     "TEMP R1;\n"
3955     "MUL R0.xyz, fragment.position.y, c[2];\n"
3956     "MAD R0.xyz, fragment.position.x, c[1], R0;\n"
3957     "ADD R0.xyz, R0, c[3];\n"
3958     "RCP R0.z, R0.z;\n"
3959     "MUL R0.xy, R0, R0.z;\n"
3960     "ABS R0.z, R0.x;\n"
3961     "ABS R0.w, R0.y;\n"
3962     "ADD R0.w, R0, -R0.z;\n"
3963     "ADD R1.x, R0.y, c[4].y;\n"
3964     "ABS R0.w, R0;\n"
3965     "CMP R0.y, -R0.w, R0, R1.x;\n"
3966     "ABS R0.w, -R0.y;\n"
3967     "MAX R1.x, R0.z, R0.w;\n"
3968     "RCP R1.y, R1.x;\n"
3969     "MIN R1.x, R0.z, R0.w;\n"
3970     "MUL R1.x, R1, R1.y;\n"
3971     "MUL R1.y, R1.x, R1.x;\n"
3972     "MAD R1.z, R1.y, c[5].x, c[5].y;\n"
3973     "MAD R1.z, R1, R1.y, -c[5];\n"
3974     "MAD R1.z, R1, R1.y, c[5].w;\n"
3975     "MAD R1.z, R1, R1.y, -c[6].x;\n"
3976     "MAD R1.y, R1.z, R1, c[6];\n"
3977     "MUL R1.x, R1.y, R1;\n"
3978     "ADD R0.z, -R0, R0.w;\n"
3979     "ADD R1.y, -R1.x, c[4].w;\n"
3980     "CMP R0.z, -R0, R1.y, R1.x;\n"
3981     "ADD R0.w, -R0.z, c[4].z;\n"
3982     "CMP R0.x, R0, R0.w, R0.z;\n"
3983     "CMP R0.x, -R0.y, -R0, R0;\n"
3984     "ADD R0.x, R0, c[0];\n"
3985     "MUL R0.x, R0, c[4];\n"
3986     "FLR R0.y, R0.x;\n"
3987     "ADD R0.x, R0, -R0.y;\n"
3988     "TEX result.color, R0, texture[0], 1D;\n"
3989     "END\n"
3990     ;
3991 
3992 static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_LINEAR_COMPOSITION_MODES_SIMPLE_PORTER_DUFF =
3993     "!!ARBfp1.0\n"
3994     "PARAM c[11] = { program.local[0..9],\n"
3995     "		{ 1 } };\n"
3996     "TEMP R0;\n"
3997     "TEMP R1;\n"
3998     "TEMP R2;\n"
3999     "TEMP R3;\n"
4000     "MUL R0.xyz, fragment.position.y, c[2];\n"
4001     "MAD R0.xyz, fragment.position.x, c[1], R0;\n"
4002     "ADD R0.xyz, R0, c[3];\n"
4003     "RCP R0.z, R0.z;\n"
4004     "MUL R0.xy, R0, R0.z;\n"
4005     "MUL R0.zw, R0.xyxy, c[0].xyxy;\n"
4006     "ADD R1.x, R0.z, R0.w;\n"
4007     "MUL R0.xy, fragment.position, c[7];\n"
4008     "TEX R0, R0, texture[0], 2D;\n"
4009     "MUL R1.x, R1, c[0].z;\n"
4010     "TEX R1, R1, texture[2], 1D;\n"
4011     "MUL R2.xyz, R0, c[4].y;\n"
4012     "MUL R3.xyz, R1.w, R2;\n"
4013     "MUL R2.xyz, R1, c[4].x;\n"
4014     "MAD R2.xyz, R0.w, R2, R3;\n"
4015     "ADD R3.xy, fragment.position, c[8];\n"
4016     "ADD R2.w, -R0, c[10].x;\n"
4017     "MUL R1.xyz, R1, c[5].y;\n"
4018     "MAD R2.xyz, R2.w, R1, R2;\n"
4019     "MUL R1.xyz, R0, c[5].z;\n"
4020     "ADD R3.z, -R1.w, c[10].x;\n"
4021     "MAD R2.xyz, R3.z, R1, R2;\n"
4022     "MUL R1.y, R1.w, R2.w;\n"
4023     "MUL R1.x, R1.w, R0.w;\n"
4024     "MUL R1.z, R0.w, R3;\n"
4025     "DP3 R2.w, R1, c[5];\n"
4026     "MUL R3.xy, R3, c[6];\n"
4027     "TEX R1, R3, texture[1], 2D;\n"
4028     "ADD R2, R2, -R0;\n"
4029     "DP4 R1.x, R1, c[9];\n"
4030     "MAD result.color, R1.x, R2, R0;\n"
4031     "END\n"
4032     ;
4033 
4034 static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_LINEAR_COMPOSITION_MODES_MULTIPLY =
4035     "!!ARBfp1.0\n"
4036     "PARAM c[9] = { program.local[0..7],\n"
4037     "		{ 1 } };\n"
4038     "TEMP R0;\n"
4039     "TEMP R1;\n"
4040     "TEMP R2;\n"
4041     "MUL R0.xyz, fragment.position.y, c[2];\n"
4042     "MAD R0.xyz, fragment.position.x, c[1], R0;\n"
4043     "ADD R0.xyz, R0, c[3];\n"
4044     "RCP R0.z, R0.z;\n"
4045     "MUL R0.xy, R0, R0.z;\n"
4046     "MUL R0.zw, R0.xyxy, c[0].xyxy;\n"
4047     "ADD R1.x, R0.z, R0.w;\n"
4048     "MUL R0.xy, fragment.position, c[5];\n"
4049     "TEX R0, R0, texture[0], 2D;\n"
4050     "MUL R1.x, R1, c[0].z;\n"
4051     "TEX R1, R1, texture[2], 1D;\n"
4052     "ADD R2.x, -R0.w, c[8];\n"
4053     "MUL R2.xyz, R1, R2.x;\n"
4054     "MAD R1.xyz, R1, R0, R2;\n"
4055     "ADD R2.x, -R1.w, c[8];\n"
4056     "MAD R2.xyz, R0, R2.x, R1;\n"
4057     "ADD R1.z, R1.w, R0.w;\n"
4058     "MAD R2.w, -R1, R0, R1.z;\n"
4059     "ADD R1.xy, fragment.position, c[6];\n"
4060     "MUL R1.xy, R1, c[4];\n"
4061     "TEX R1, R1, texture[1], 2D;\n"
4062     "ADD R2, R2, -R0;\n"
4063     "DP4 R1.x, R1, c[7];\n"
4064     "MAD result.color, R1.x, R2, R0;\n"
4065     "END\n"
4066     ;
4067 
4068 static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_LINEAR_COMPOSITION_MODES_SCREEN =
4069     "!!ARBfp1.0\n"
4070     "PARAM c[8] = { program.local[0..7] };\n"
4071     "TEMP R0;\n"
4072     "TEMP R1;\n"
4073     "TEMP R2;\n"
4074     "TEMP R3;\n"
4075     "MUL R0.xyz, fragment.position.y, c[2];\n"
4076     "MAD R0.xyz, fragment.position.x, c[1], R0;\n"
4077     "ADD R0.xyz, R0, c[3];\n"
4078     "RCP R0.z, R0.z;\n"
4079     "MUL R0.xy, R0, R0.z;\n"
4080     "MUL R0.xy, R0, c[0];\n"
4081     "ADD R0.x, R0, R0.y;\n"
4082     "MUL R0.z, R0.x, c[0];\n"
4083     "ADD R3.xy, fragment.position, c[6];\n"
4084     "TEX R1, R0.z, texture[2], 1D;\n"
4085     "MUL R0.xy, fragment.position, c[5];\n"
4086     "TEX R0, R0, texture[0], 2D;\n"
4087     "ADD R2, R1, R0;\n"
4088     "MAD R2, -R1, R0, R2;\n"
4089     "MUL R3.xy, R3, c[4];\n"
4090     "TEX R1, R3, texture[1], 2D;\n"
4091     "ADD R2, R2, -R0;\n"
4092     "DP4 R1.x, R1, c[7];\n"
4093     "MAD result.color, R1.x, R2, R0;\n"
4094     "END\n"
4095     ;
4096 
4097 static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_LINEAR_COMPOSITION_MODES_OVERLAY =
4098     "!!ARBfp1.0\n"
4099     "PARAM c[9] = { program.local[0..7],\n"
4100     "		{ 2, 1 } };\n"
4101     "TEMP R0;\n"
4102     "TEMP R1;\n"
4103     "TEMP R2;\n"
4104     "TEMP R3;\n"
4105     "TEMP R4;\n"
4106     "MUL R0.xyz, fragment.position.y, c[2];\n"
4107     "MAD R0.xyz, fragment.position.x, c[1], R0;\n"
4108     "ADD R0.xyz, R0, c[3];\n"
4109     "RCP R0.z, R0.z;\n"
4110     "MUL R0.xy, R0, R0.z;\n"
4111     "MUL R0.xy, R0, c[0];\n"
4112     "ADD R0.x, R0, R0.y;\n"
4113     "MUL R0.x, R0, c[0].z;\n"
4114     "TEX R0, R0, texture[2], 1D;\n"
4115     "MUL R1.xy, fragment.position, c[5];\n"
4116     "TEX R1, R1, texture[0], 2D;\n"
4117     "ADD R2.w, -R1, c[8].y;\n"
4118     "ADD R3.xyz, R0.w, -R0;\n"
4119     "ADD R2.xyz, R1.w, -R1;\n"
4120     "MUL R2.xyz, R2, R3;\n"
4121     "MUL R2.xyz, R2, c[8].x;\n"
4122     "MAD R2.xyz, R0.w, R1.w, -R2;\n"
4123     "MUL R4.xyz, R0, R2.w;\n"
4124     "MUL R3.xyz, R0, R1;\n"
4125     "MAD R0.xyz, R0, R2.w, R2;\n"
4126     "ADD R2.x, -R0.w, c[8].y;\n"
4127     "MAD R3.xyz, R3, c[8].x, R4;\n"
4128     "MAD R3.xyz, R1, R2.x, R3;\n"
4129     "MAD R0.xyz, R1, R2.x, R0;\n"
4130     "MUL R2.xyz, R1, c[8].x;\n"
4131     "ADD R0.xyz, R0, -R3;\n"
4132     "SGE R2.xyz, R2, R1.w;\n"
4133     "MAD R2.xyz, R2, R0, R3;\n"
4134     "ADD R0.z, R0.w, R1.w;\n"
4135     "MAD R2.w, -R0, R1, R0.z;\n"
4136     "ADD R0.xy, fragment.position, c[6];\n"
4137     "MUL R0.xy, R0, c[4];\n"
4138     "TEX R0, R0, texture[1], 2D;\n"
4139     "ADD R2, R2, -R1;\n"
4140     "DP4 R0.x, R0, c[7];\n"
4141     "MAD result.color, R0.x, R2, R1;\n"
4142     "END\n"
4143     ;
4144 
4145 static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_LINEAR_COMPOSITION_MODES_DARKEN =
4146     "!!ARBfp1.0\n"
4147     "PARAM c[9] = { program.local[0..7],\n"
4148     "		{ 1 } };\n"
4149     "TEMP R0;\n"
4150     "TEMP R1;\n"
4151     "TEMP R2;\n"
4152     "TEMP R3;\n"
4153     "MUL R0.xyz, fragment.position.y, c[2];\n"
4154     "MAD R0.xyz, fragment.position.x, c[1], R0;\n"
4155     "ADD R0.xyz, R0, c[3];\n"
4156     "RCP R0.z, R0.z;\n"
4157     "MUL R0.xy, R0, R0.z;\n"
4158     "MUL R0.xy, R0, c[0];\n"
4159     "ADD R0.z, R0.x, R0.y;\n"
4160     "MUL R1.x, R0.z, c[0].z;\n"
4161     "MUL R0.xy, fragment.position, c[5];\n"
4162     "TEX R0, R0, texture[0], 2D;\n"
4163     "TEX R1, R1, texture[2], 1D;\n"
4164     "MUL R3.xyz, R1.w, R0;\n"
4165     "MUL R2.xyz, R1, R0.w;\n"
4166     "MIN R2.xyz, R2, R3;\n"
4167     "ADD R2.w, -R0, c[8].x;\n"
4168     "MAD R1.xyz, R1, R2.w, R2;\n"
4169     "ADD R2.x, -R1.w, c[8];\n"
4170     "MAD R2.xyz, R0, R2.x, R1;\n"
4171     "ADD R1.z, R1.w, R0.w;\n"
4172     "MAD R2.w, -R1, R0, R1.z;\n"
4173     "ADD R1.xy, fragment.position, c[6];\n"
4174     "MUL R1.xy, R1, c[4];\n"
4175     "TEX R1, R1, texture[1], 2D;\n"
4176     "ADD R2, R2, -R0;\n"
4177     "DP4 R1.x, R1, c[7];\n"
4178     "MAD result.color, R1.x, R2, R0;\n"
4179     "END\n"
4180     ;
4181 
4182 static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_LINEAR_COMPOSITION_MODES_LIGHTEN =
4183     "!!ARBfp1.0\n"
4184     "PARAM c[9] = { program.local[0..7],\n"
4185     "		{ 1 } };\n"
4186     "TEMP R0;\n"
4187     "TEMP R1;\n"
4188     "TEMP R2;\n"
4189     "TEMP R3;\n"
4190     "MUL R0.xyz, fragment.position.y, c[2];\n"
4191     "MAD R0.xyz, fragment.position.x, c[1], R0;\n"
4192     "ADD R0.xyz, R0, c[3];\n"
4193     "RCP R0.z, R0.z;\n"
4194     "MUL R0.xy, R0, R0.z;\n"
4195     "MUL R0.xy, R0, c[0];\n"
4196     "ADD R0.z, R0.x, R0.y;\n"
4197     "MUL R1.x, R0.z, c[0].z;\n"
4198     "MUL R0.xy, fragment.position, c[5];\n"
4199     "TEX R0, R0, texture[0], 2D;\n"
4200     "TEX R1, R1, texture[2], 1D;\n"
4201     "MUL R3.xyz, R1.w, R0;\n"
4202     "MUL R2.xyz, R1, R0.w;\n"
4203     "MAX R2.xyz, R2, R3;\n"
4204     "ADD R2.w, -R0, c[8].x;\n"
4205     "MAD R1.xyz, R1, R2.w, R2;\n"
4206     "ADD R2.x, -R1.w, c[8];\n"
4207     "MAD R2.xyz, R0, R2.x, R1;\n"
4208     "ADD R1.z, R1.w, R0.w;\n"
4209     "MAD R2.w, -R1, R0, R1.z;\n"
4210     "ADD R1.xy, fragment.position, c[6];\n"
4211     "MUL R1.xy, R1, c[4];\n"
4212     "TEX R1, R1, texture[1], 2D;\n"
4213     "ADD R2, R2, -R0;\n"
4214     "DP4 R1.x, R1, c[7];\n"
4215     "MAD result.color, R1.x, R2, R0;\n"
4216     "END\n"
4217     ;
4218 
4219 static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_LINEAR_COMPOSITION_MODES_COLORDODGE =
4220     "!!ARBfp1.0\n"
4221     "PARAM c[9] = { program.local[0..7],\n"
4222     "		{ 1, 1e-006 } };\n"
4223     "TEMP R0;\n"
4224     "TEMP R1;\n"
4225     "TEMP R2;\n"
4226     "TEMP R3;\n"
4227     "TEMP R4;\n"
4228     "MUL R0.xyz, fragment.position.y, c[2];\n"
4229     "MAD R0.xyz, fragment.position.x, c[1], R0;\n"
4230     "ADD R0.xyz, R0, c[3];\n"
4231     "RCP R0.z, R0.z;\n"
4232     "MUL R0.xy, R0, R0.z;\n"
4233     "MUL R0.xy, R0, c[0];\n"
4234     "ADD R0.x, R0, R0.y;\n"
4235     "MUL R0.x, R0, c[0].z;\n"
4236     "TEX R0, R0, texture[2], 1D;\n"
4237     "MAX R1.x, R0.w, c[8].y;\n"
4238     "RCP R1.x, R1.x;\n"
4239     "MAD R2.xyz, -R0, R1.x, c[8].x;\n"
4240     "MAX R2.xyz, R2, c[8].y;\n"
4241     "MUL R1.xy, fragment.position, c[5];\n"
4242     "TEX R1, R1, texture[0], 2D;\n"
4243     "ADD R2.w, -R0, c[8].x;\n"
4244     "MUL R3.xyz, R1, R2.w;\n"
4245     "ADD R2.w, -R1, c[8].x;\n"
4246     "MAD R4.xyz, R0, R2.w, R3;\n"
4247     "MUL R3.xyz, R0.w, R1;\n"
4248     "MUL R2.w, R0, R1;\n"
4249     "MAD R0.xyz, R0, R1.w, R3;\n"
4250     "SGE R0.xyz, R0, R2.w;\n"
4251     "RCP R2.x, R2.x;\n"
4252     "RCP R2.y, R2.y;\n"
4253     "RCP R2.z, R2.z;\n"
4254     "MAD R2.xyz, R3, R2, R4;\n"
4255     "MAD R4.xyz, R0.w, R1.w, R4;\n"
4256     "ADD R4.xyz, R4, -R2;\n"
4257     "MAD R2.xyz, R0, R4, R2;\n"
4258     "ADD R0.z, R0.w, R1.w;\n"
4259     "MAD R2.w, -R0, R1, R0.z;\n"
4260     "ADD R0.xy, fragment.position, c[6];\n"
4261     "MUL R0.xy, R0, c[4];\n"
4262     "TEX R0, R0, texture[1], 2D;\n"
4263     "ADD R2, R2, -R1;\n"
4264     "DP4 R0.x, R0, c[7];\n"
4265     "MAD result.color, R0.x, R2, R1;\n"
4266     "END\n"
4267     ;
4268 
4269 static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_LINEAR_COMPOSITION_MODES_COLORBURN =
4270     "!!ARBfp1.0\n"
4271     "PARAM c[9] = { program.local[0..7],\n"
4272     "		{ 1, 9.9999997e-006 } };\n"
4273     "TEMP R0;\n"
4274     "TEMP R1;\n"
4275     "TEMP R2;\n"
4276     "TEMP R3;\n"
4277     "TEMP R4;\n"
4278     "TEMP R5;\n"
4279     "MUL R0.xyz, fragment.position.y, c[2];\n"
4280     "MAD R0.xyz, fragment.position.x, c[1], R0;\n"
4281     "ADD R0.xyz, R0, c[3];\n"
4282     "RCP R0.z, R0.z;\n"
4283     "MUL R0.xy, R0, R0.z;\n"
4284     "MUL R0.xy, R0, c[0];\n"
4285     "ADD R0.x, R0, R0.y;\n"
4286     "MUL R0.zw, fragment.position.xyxy, c[5].xyxy;\n"
4287     "TEX R1, R0.zwzw, texture[0], 2D;\n"
4288     "MUL R0.x, R0, c[0].z;\n"
4289     "TEX R0, R0, texture[2], 1D;\n"
4290     "MUL R2.xyz, R0.w, R1;\n"
4291     "MAD R3.xyz, R0, R1.w, R2;\n"
4292     "MAD R2.xyz, -R0.w, R1.w, R3;\n"
4293     "MUL R4.xyz, R0.w, R2;\n"
4294     "MAX R2.xyz, R0, c[8].y;\n"
4295     "ADD R2.w, -R1, c[8].x;\n"
4296     "MUL R5.xyz, R0, R2.w;\n"
4297     "ADD R3.w, -R0, c[8].x;\n"
4298     "RCP R2.x, R2.x;\n"
4299     "RCP R2.y, R2.y;\n"
4300     "RCP R2.z, R2.z;\n"
4301     "MAD R2.xyz, R4, R2, R5;\n"
4302     "MUL R4.xyz, R1, R3.w;\n"
4303     "MAD R0.xyz, R0, R2.w, R4;\n"
4304     "MUL R2.w, R0, R1;\n"
4305     "MAD R2.xyz, R1, R3.w, R2;\n"
4306     "ADD R2.xyz, R2, -R0;\n"
4307     "SGE R3.xyz, R3, R2.w;\n"
4308     "MAD R2.xyz, R3, R2, R0;\n"
4309     "ADD R0.z, R0.w, R1.w;\n"
4310     "MAD R2.w, -R0, R1, R0.z;\n"
4311     "ADD R0.xy, fragment.position, c[6];\n"
4312     "MUL R0.xy, R0, c[4];\n"
4313     "TEX R0, R0, texture[1], 2D;\n"
4314     "ADD R2, R2, -R1;\n"
4315     "DP4 R0.x, R0, c[7];\n"
4316     "MAD result.color, R0.x, R2, R1;\n"
4317     "END\n"
4318     ;
4319 
4320 static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_LINEAR_COMPOSITION_MODES_HARDLIGHT =
4321     "!!ARBfp1.0\n"
4322     "PARAM c[9] = { program.local[0..7],\n"
4323     "		{ 2, 1 } };\n"
4324     "TEMP R0;\n"
4325     "TEMP R1;\n"
4326     "TEMP R2;\n"
4327     "TEMP R3;\n"
4328     "TEMP R4;\n"
4329     "MUL R0.xyz, fragment.position.y, c[2];\n"
4330     "MAD R0.xyz, fragment.position.x, c[1], R0;\n"
4331     "ADD R0.xyz, R0, c[3];\n"
4332     "RCP R0.z, R0.z;\n"
4333     "MUL R0.xy, R0, R0.z;\n"
4334     "MUL R0.xy, R0, c[0];\n"
4335     "ADD R0.x, R0, R0.y;\n"
4336     "MUL R0.x, R0, c[0].z;\n"
4337     "TEX R0, R0, texture[2], 1D;\n"
4338     "MUL R1.xy, fragment.position, c[5];\n"
4339     "TEX R1, R1, texture[0], 2D;\n"
4340     "ADD R2.w, -R1, c[8].y;\n"
4341     "ADD R3.xyz, R0.w, -R0;\n"
4342     "ADD R2.xyz, R1.w, -R1;\n"
4343     "MUL R2.xyz, R2, R3;\n"
4344     "MUL R2.xyz, R2, c[8].x;\n"
4345     "MAD R2.xyz, R0.w, R1.w, -R2;\n"
4346     "MUL R4.xyz, R0, R2.w;\n"
4347     "MAD R2.xyz, R0, R2.w, R2;\n"
4348     "MUL R3.xyz, R0, R1;\n"
4349     "ADD R2.w, -R0, c[8].y;\n"
4350     "MAD R3.xyz, R3, c[8].x, R4;\n"
4351     "MUL R0.xyz, R0, c[8].x;\n"
4352     "SGE R0.xyz, R0, R0.w;\n"
4353     "MAD R3.xyz, R1, R2.w, R3;\n"
4354     "MAD R2.xyz, R1, R2.w, R2;\n"
4355     "ADD R2.xyz, R2, -R3;\n"
4356     "MAD R2.xyz, R0, R2, R3;\n"
4357     "ADD R0.z, R0.w, R1.w;\n"
4358     "MAD R2.w, -R0, R1, R0.z;\n"
4359     "ADD R0.xy, fragment.position, c[6];\n"
4360     "MUL R0.xy, R0, c[4];\n"
4361     "TEX R0, R0, texture[1], 2D;\n"
4362     "ADD R2, R2, -R1;\n"
4363     "DP4 R0.x, R0, c[7];\n"
4364     "MAD result.color, R0.x, R2, R1;\n"
4365     "END\n"
4366     ;
4367 
4368 static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_LINEAR_COMPOSITION_MODES_SOFTLIGHT =
4369     "!!ARBfp1.0\n"
4370     "PARAM c[10] = { program.local[0..7],\n"
4371     "		{ 1, 2, 9.9999997e-006, 4 },\n"
4372     "		{ 16, 12, 3 } };\n"
4373     "TEMP R0;\n"
4374     "TEMP R1;\n"
4375     "TEMP R2;\n"
4376     "TEMP R3;\n"
4377     "TEMP R4;\n"
4378     "TEMP R5;\n"
4379     "TEMP R6;\n"
4380     "MUL R0.xyz, fragment.position.y, c[2];\n"
4381     "MAD R0.xyz, fragment.position.x, c[1], R0;\n"
4382     "ADD R0.xyz, R0, c[3];\n"
4383     "RCP R0.z, R0.z;\n"
4384     "MUL R0.xy, R0, R0.z;\n"
4385     "MUL R0.xy, R0, c[0];\n"
4386     "ADD R0.x, R0, R0.y;\n"
4387     "MUL R1.xy, fragment.position, c[5];\n"
4388     "TEX R1, R1, texture[0], 2D;\n"
4389     "MAX R0.z, R1.w, c[8];\n"
4390     "RCP R0.z, R0.z;\n"
4391     "MUL R3.xyz, R1, R0.z;\n"
4392     "MAD R2.xyz, R3, c[9].x, -c[9].y;\n"
4393     "MUL R0.x, R0, c[0].z;\n"
4394     "TEX R0, R0, texture[2], 1D;\n"
4395     "MAD R4.xyz, R3, R2, c[9].z;\n"
4396     "MAD R2.xyz, R0, c[8].y, -R0.w;\n"
4397     "MUL R5.xyz, R1.w, R2;\n"
4398     "MUL R6.xyz, R5, R4;\n"
4399     "RSQ R2.w, R3.x;\n"
4400     "RCP R4.x, R2.w;\n"
4401     "RSQ R2.w, R3.y;\n"
4402     "RSQ R3.w, R3.z;\n"
4403     "RCP R4.y, R2.w;\n"
4404     "RCP R4.z, R3.w;\n"
4405     "ADD R4.xyz, -R3, R4;\n"
4406     "MUL R6.xyz, R3, R6;\n"
4407     "MUL R4.xyz, R5, R4;\n"
4408     "ADD R3.xyz, -R3, c[8].x;\n"
4409     "MAD R2.xyz, R2, R3, R0.w;\n"
4410     "MUL R3.xyz, R0, c[8].y;\n"
4411     "MAD R5.xyz, R0.w, R1, R6;\n"
4412     "MAD R4.xyz, R0.w, R1, R4;\n"
4413     "ADD R6.xyz, R4, -R5;\n"
4414     "MUL R4.xyz, R1, c[8].w;\n"
4415     "SGE R4.xyz, R4, R1.w;\n"
4416     "MAD R4.xyz, R4, R6, R5;\n"
4417     "MAD R4.xyz, -R1, R2, R4;\n"
4418     "SGE R3.xyz, R3, R0.w;\n"
4419     "MUL R2.xyz, R1, R2;\n"
4420     "ADD R2.w, -R1, c[8].x;\n"
4421     "MAD R2.xyz, R3, R4, R2;\n"
4422     "MAD R2.xyz, R0, R2.w, R2;\n"
4423     "ADD R0.x, -R0.w, c[8];\n"
4424     "MAD R2.xyz, R1, R0.x, R2;\n"
4425     "ADD R0.z, R0.w, R1.w;\n"
4426     "MAD R2.w, -R0, R1, R0.z;\n"
4427     "ADD R0.xy, fragment.position, c[6];\n"
4428     "MUL R0.xy, R0, c[4];\n"
4429     "TEX R0, R0, texture[1], 2D;\n"
4430     "ADD R2, R2, -R1;\n"
4431     "DP4 R0.x, R0, c[7];\n"
4432     "MAD result.color, R0.x, R2, R1;\n"
4433     "END\n"
4434     ;
4435 
4436 static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_LINEAR_COMPOSITION_MODES_DIFFERENCE =
4437     "!!ARBfp1.0\n"
4438     "PARAM c[9] = { program.local[0..7],\n"
4439     "		{ 2 } };\n"
4440     "TEMP R0;\n"
4441     "TEMP R1;\n"
4442     "TEMP R2;\n"
4443     "TEMP R3;\n"
4444     "MUL R0.xyz, fragment.position.y, c[2];\n"
4445     "MAD R0.xyz, fragment.position.x, c[1], R0;\n"
4446     "ADD R0.xyz, R0, c[3];\n"
4447     "RCP R0.z, R0.z;\n"
4448     "MUL R0.xy, R0, R0.z;\n"
4449     "MUL R0.xy, R0, c[0];\n"
4450     "ADD R0.z, R0.x, R0.y;\n"
4451     "MUL R1.x, R0.z, c[0].z;\n"
4452     "MUL R0.xy, fragment.position, c[5];\n"
4453     "TEX R0, R0, texture[0], 2D;\n"
4454     "TEX R1, R1, texture[2], 1D;\n"
4455     "ADD R2.xyz, R1, R0;\n"
4456     "MUL R3.xyz, R1.w, R0;\n"
4457     "MUL R1.xyz, R1, R0.w;\n"
4458     "MIN R1.xyz, R1, R3;\n"
4459     "MAD R2.xyz, -R1, c[8].x, R2;\n"
4460     "ADD R1.z, R1.w, R0.w;\n"
4461     "MAD R2.w, -R1, R0, R1.z;\n"
4462     "ADD R1.xy, fragment.position, c[6];\n"
4463     "MUL R1.xy, R1, c[4];\n"
4464     "TEX R1, R1, texture[1], 2D;\n"
4465     "ADD R2, R2, -R0;\n"
4466     "DP4 R1.x, R1, c[7];\n"
4467     "MAD result.color, R1.x, R2, R0;\n"
4468     "END\n"
4469     ;
4470 
4471 static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_LINEAR_COMPOSITION_MODES_EXCLUSION =
4472     "!!ARBfp1.0\n"
4473     "PARAM c[9] = { program.local[0..7],\n"
4474     "		{ 2, 1 } };\n"
4475     "TEMP R0;\n"
4476     "TEMP R1;\n"
4477     "TEMP R2;\n"
4478     "TEMP R3;\n"
4479     "MUL R0.xyz, fragment.position.y, c[2];\n"
4480     "MAD R0.xyz, fragment.position.x, c[1], R0;\n"
4481     "ADD R0.xyz, R0, c[3];\n"
4482     "RCP R0.z, R0.z;\n"
4483     "MUL R0.xy, R0, R0.z;\n"
4484     "MUL R0.xy, R0, c[0];\n"
4485     "ADD R0.z, R0.x, R0.y;\n"
4486     "MUL R1.x, R0.z, c[0].z;\n"
4487     "MUL R0.xy, fragment.position, c[5];\n"
4488     "TEX R0, R0, texture[0], 2D;\n"
4489     "TEX R1, R1, texture[2], 1D;\n"
4490     "MUL R2.xyz, R1.w, R0;\n"
4491     "MAD R3.xyz, R1, R0.w, R2;\n"
4492     "MUL R2.xyz, R1, R0;\n"
4493     "MAD R2.xyz, -R2, c[8].x, R3;\n"
4494     "ADD R2.w, -R0, c[8].y;\n"
4495     "MAD R1.xyz, R1, R2.w, R2;\n"
4496     "ADD R2.x, -R1.w, c[8].y;\n"
4497     "MAD R2.xyz, R0, R2.x, R1;\n"
4498     "ADD R1.z, R1.w, R0.w;\n"
4499     "MAD R2.w, -R1, R0, R1.z;\n"
4500     "ADD R1.xy, fragment.position, c[6];\n"
4501     "MUL R1.xy, R1, c[4];\n"
4502     "TEX R1, R1, texture[1], 2D;\n"
4503     "ADD R2, R2, -R0;\n"
4504     "DP4 R1.x, R1, c[7];\n"
4505     "MAD result.color, R1.x, R2, R0;\n"
4506     "END\n"
4507     ;
4508 
4509 static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_LINEAR_COMPOSITION_MODES_SIMPLE_PORTER_DUFF_NOMASK =
4510     "!!ARBfp1.0\n"
4511     "PARAM c[8] = { program.local[0..6],\n"
4512     "		{ 1 } };\n"
4513     "TEMP R0;\n"
4514     "TEMP R1;\n"
4515     "TEMP R2;\n"
4516     "TEMP R3;\n"
4517     "MUL R0.xyz, fragment.position.y, c[2];\n"
4518     "MAD R0.xyz, fragment.position.x, c[1], R0;\n"
4519     "ADD R0.xyz, R0, c[3];\n"
4520     "RCP R0.z, R0.z;\n"
4521     "MUL R0.xy, R0, R0.z;\n"
4522     "MUL R0.xy, R0, c[0];\n"
4523     "ADD R0.x, R0, R0.y;\n"
4524     "MUL R0.zw, fragment.position.xyxy, c[6].xyxy;\n"
4525     "TEX R1, R0.zwzw, texture[0], 2D;\n"
4526     "MUL R2.xyz, R1, c[4].y;\n"
4527     "MUL R0.x, R0, c[0].z;\n"
4528     "TEX R0, R0, texture[1], 1D;\n"
4529     "MUL R3.xyz, R0.w, R2;\n"
4530     "MUL R2.xyz, R0, c[4].x;\n"
4531     "MAD R2.xyz, R1.w, R2, R3;\n"
4532     "ADD R2.w, -R1, c[7].x;\n"
4533     "MUL R0.xyz, R0, c[5].y;\n"
4534     "MAD R0.xyz, R2.w, R0, R2;\n"
4535     "ADD R2.x, -R0.w, c[7];\n"
4536     "MUL R1.xyz, R1, c[5].z;\n"
4537     "MAD result.color.xyz, R2.x, R1, R0;\n"
4538     "MUL R0.x, R0.w, R1.w;\n"
4539     "MUL R0.z, R1.w, R2.x;\n"
4540     "MUL R0.y, R0.w, R2.w;\n"
4541     "DP3 result.color.w, R0, c[5];\n"
4542     "END\n"
4543     ;
4544 
4545 static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_LINEAR_COMPOSITION_MODES_MULTIPLY_NOMASK =
4546     "!!ARBfp1.0\n"
4547     "PARAM c[6] = { program.local[0..4],\n"
4548     "		{ 1 } };\n"
4549     "TEMP R0;\n"
4550     "TEMP R1;\n"
4551     "TEMP R2;\n"
4552     "MUL R0.xyz, fragment.position.y, c[2];\n"
4553     "MAD R0.xyz, fragment.position.x, c[1], R0;\n"
4554     "ADD R0.xyz, R0, c[3];\n"
4555     "RCP R0.z, R0.z;\n"
4556     "MUL R0.xy, R0, R0.z;\n"
4557     "MUL R0.xy, R0, c[0];\n"
4558     "ADD R0.x, R0, R0.y;\n"
4559     "MUL R0.zw, fragment.position.xyxy, c[4].xyxy;\n"
4560     "TEX R1, R0.zwzw, texture[0], 2D;\n"
4561     "MUL R0.x, R0, c[0].z;\n"
4562     "TEX R0, R0, texture[1], 1D;\n"
4563     "ADD R2.x, -R1.w, c[5];\n"
4564     "MUL R2.xyz, R0, R2.x;\n"
4565     "MAD R0.xyz, R0, R1, R2;\n"
4566     "ADD R2.x, R0.w, R1.w;\n"
4567     "ADD R2.y, -R0.w, c[5].x;\n"
4568     "MAD result.color.xyz, R1, R2.y, R0;\n"
4569     "MAD result.color.w, -R0, R1, R2.x;\n"
4570     "END\n"
4571     ;
4572 
4573 static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_LINEAR_COMPOSITION_MODES_SCREEN_NOMASK =
4574     "!!ARBfp1.0\n"
4575     "PARAM c[5] = { program.local[0..4] };\n"
4576     "TEMP R0;\n"
4577     "TEMP R1;\n"
4578     "TEMP R2;\n"
4579     "MUL R0.xyz, fragment.position.y, c[2];\n"
4580     "MAD R0.xyz, fragment.position.x, c[1], R0;\n"
4581     "ADD R0.xyz, R0, c[3];\n"
4582     "RCP R0.z, R0.z;\n"
4583     "MUL R0.xy, R0, R0.z;\n"
4584     "MUL R0.xy, R0, c[0];\n"
4585     "ADD R0.x, R0, R0.y;\n"
4586     "MUL R0.zw, fragment.position.xyxy, c[4].xyxy;\n"
4587     "TEX R1, R0.zwzw, texture[0], 2D;\n"
4588     "MUL R0.x, R0, c[0].z;\n"
4589     "TEX R0, R0, texture[1], 1D;\n"
4590     "ADD R2, R0, R1;\n"
4591     "MAD result.color, -R0, R1, R2;\n"
4592     "END\n"
4593     ;
4594 
4595 static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_LINEAR_COMPOSITION_MODES_OVERLAY_NOMASK =
4596     "!!ARBfp1.0\n"
4597     "PARAM c[6] = { program.local[0..4],\n"
4598     "		{ 2, 1 } };\n"
4599     "TEMP R0;\n"
4600     "TEMP R1;\n"
4601     "TEMP R2;\n"
4602     "TEMP R3;\n"
4603     "MUL R0.xyz, fragment.position.y, c[2];\n"
4604     "MAD R0.xyz, fragment.position.x, c[1], R0;\n"
4605     "ADD R0.xyz, R0, c[3];\n"
4606     "RCP R0.z, R0.z;\n"
4607     "MUL R0.xy, R0, R0.z;\n"
4608     "MUL R0.xy, R0, c[0];\n"
4609     "ADD R0.x, R0, R0.y;\n"
4610     "MUL R0.x, R0, c[0].z;\n"
4611     "TEX R0, R0, texture[1], 1D;\n"
4612     "MUL R1.xy, fragment.position, c[4];\n"
4613     "TEX R1, R1, texture[0], 2D;\n"
4614     "ADD R3.xyz, R0.w, -R0;\n"
4615     "ADD R2.xyz, R1.w, -R1;\n"
4616     "MUL R2.xyz, R2, R3;\n"
4617     "ADD R2.w, -R1, c[5].y;\n"
4618     "MUL R2.xyz, R2, c[5].x;\n"
4619     "MAD R2.xyz, R0.w, R1.w, -R2;\n"
4620     "MAD R2.xyz, R0, R2.w, R2;\n"
4621     "MUL R3.xyz, R0, R2.w;\n"
4622     "MUL R0.xyz, R0, R1;\n"
4623     "ADD R2.w, -R0, c[5].y;\n"
4624     "MAD R0.xyz, R0, c[5].x, R3;\n"
4625     "MAD R0.xyz, R1, R2.w, R0;\n"
4626     "MAD R2.xyz, R1, R2.w, R2;\n"
4627     "MUL R1.xyz, R1, c[5].x;\n"
4628     "ADD R2.w, R0, R1;\n"
4629     "ADD R2.xyz, R2, -R0;\n"
4630     "SGE R1.xyz, R1, R1.w;\n"
4631     "MAD result.color.xyz, R1, R2, R0;\n"
4632     "MAD result.color.w, -R0, R1, R2;\n"
4633     "END\n"
4634     ;
4635 
4636 static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_LINEAR_COMPOSITION_MODES_DARKEN_NOMASK =
4637     "!!ARBfp1.0\n"
4638     "PARAM c[6] = { program.local[0..4],\n"
4639     "		{ 1 } };\n"
4640     "TEMP R0;\n"
4641     "TEMP R1;\n"
4642     "TEMP R2;\n"
4643     "TEMP R3;\n"
4644     "MUL R0.xyz, fragment.position.y, c[2];\n"
4645     "MAD R0.xyz, fragment.position.x, c[1], R0;\n"
4646     "ADD R0.xyz, R0, c[3];\n"
4647     "RCP R0.z, R0.z;\n"
4648     "MUL R0.xy, R0, R0.z;\n"
4649     "MUL R0.xy, R0, c[0];\n"
4650     "ADD R0.x, R0, R0.y;\n"
4651     "MUL R0.zw, fragment.position.xyxy, c[4].xyxy;\n"
4652     "TEX R1, R0.zwzw, texture[0], 2D;\n"
4653     "MUL R0.x, R0, c[0].z;\n"
4654     "TEX R0, R0, texture[1], 1D;\n"
4655     "MUL R2.xyz, R0, R1.w;\n"
4656     "MUL R3.xyz, R0.w, R1;\n"
4657     "MIN R2.xyz, R2, R3;\n"
4658     "ADD R2.w, -R1, c[5].x;\n"
4659     "MAD R0.xyz, R0, R2.w, R2;\n"
4660     "ADD R2.x, R0.w, R1.w;\n"
4661     "ADD R2.y, -R0.w, c[5].x;\n"
4662     "MAD result.color.xyz, R1, R2.y, R0;\n"
4663     "MAD result.color.w, -R0, R1, R2.x;\n"
4664     "END\n"
4665     ;
4666 
4667 static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_LINEAR_COMPOSITION_MODES_LIGHTEN_NOMASK =
4668     "!!ARBfp1.0\n"
4669     "PARAM c[6] = { program.local[0..4],\n"
4670     "		{ 1 } };\n"
4671     "TEMP R0;\n"
4672     "TEMP R1;\n"
4673     "TEMP R2;\n"
4674     "TEMP R3;\n"
4675     "MUL R0.xyz, fragment.position.y, c[2];\n"
4676     "MAD R0.xyz, fragment.position.x, c[1], R0;\n"
4677     "ADD R0.xyz, R0, c[3];\n"
4678     "RCP R0.z, R0.z;\n"
4679     "MUL R0.xy, R0, R0.z;\n"
4680     "MUL R0.xy, R0, c[0];\n"
4681     "ADD R0.x, R0, R0.y;\n"
4682     "MUL R0.zw, fragment.position.xyxy, c[4].xyxy;\n"
4683     "TEX R1, R0.zwzw, texture[0], 2D;\n"
4684     "MUL R0.x, R0, c[0].z;\n"
4685     "TEX R0, R0, texture[1], 1D;\n"
4686     "MUL R2.xyz, R0, R1.w;\n"
4687     "MUL R3.xyz, R0.w, R1;\n"
4688     "MAX R2.xyz, R2, R3;\n"
4689     "ADD R2.w, -R1, c[5].x;\n"
4690     "MAD R0.xyz, R0, R2.w, R2;\n"
4691     "ADD R2.x, R0.w, R1.w;\n"
4692     "ADD R2.y, -R0.w, c[5].x;\n"
4693     "MAD result.color.xyz, R1, R2.y, R0;\n"
4694     "MAD result.color.w, -R0, R1, R2.x;\n"
4695     "END\n"
4696     ;
4697 
4698 static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_LINEAR_COMPOSITION_MODES_COLORDODGE_NOMASK =
4699     "!!ARBfp1.0\n"
4700     "PARAM c[6] = { program.local[0..4],\n"
4701     "		{ 1, 1e-006 } };\n"
4702     "TEMP R0;\n"
4703     "TEMP R1;\n"
4704     "TEMP R2;\n"
4705     "TEMP R3;\n"
4706     "MUL R0.xyz, fragment.position.y, c[2];\n"
4707     "MAD R0.xyz, fragment.position.x, c[1], R0;\n"
4708     "ADD R0.xyz, R0, c[3];\n"
4709     "RCP R0.z, R0.z;\n"
4710     "MUL R0.xy, R0, R0.z;\n"
4711     "MUL R0.xy, R0, c[0];\n"
4712     "ADD R0.x, R0, R0.y;\n"
4713     "MUL R0.x, R0, c[0].z;\n"
4714     "TEX R0, R0, texture[1], 1D;\n"
4715     "MAX R1.x, R0.w, c[5].y;\n"
4716     "RCP R1.x, R1.x;\n"
4717     "MAD R3.xyz, -R0, R1.x, c[5].x;\n"
4718     "MAX R3.xyz, R3, c[5].y;\n"
4719     "MUL R1.xy, fragment.position, c[4];\n"
4720     "TEX R1, R1, texture[0], 2D;\n"
4721     "ADD R2.x, -R0.w, c[5];\n"
4722     "MUL R2.xyz, R1, R2.x;\n"
4723     "ADD R2.w, -R1, c[5].x;\n"
4724     "MAD R2.xyz, R0, R2.w, R2;\n"
4725     "MUL R1.xyz, R0.w, R1;\n"
4726     "MAD R0.xyz, R0, R1.w, R1;\n"
4727     "MUL R2.w, R0, R1;\n"
4728     "RCP R3.x, R3.x;\n"
4729     "RCP R3.y, R3.y;\n"
4730     "RCP R3.z, R3.z;\n"
4731     "MAD R3.xyz, R1, R3, R2;\n"
4732     "MAD R2.xyz, R0.w, R1.w, R2;\n"
4733     "ADD R1.x, R0.w, R1.w;\n"
4734     "ADD R2.xyz, R2, -R3;\n"
4735     "SGE R0.xyz, R0, R2.w;\n"
4736     "MAD result.color.xyz, R0, R2, R3;\n"
4737     "MAD result.color.w, -R0, R1, R1.x;\n"
4738     "END\n"
4739     ;
4740 
4741 static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_LINEAR_COMPOSITION_MODES_COLORBURN_NOMASK =
4742     "!!ARBfp1.0\n"
4743     "PARAM c[6] = { program.local[0..4],\n"
4744     "		{ 1, 9.9999997e-006 } };\n"
4745     "TEMP R0;\n"
4746     "TEMP R1;\n"
4747     "TEMP R2;\n"
4748     "TEMP R3;\n"
4749     "TEMP R4;\n"
4750     "TEMP R5;\n"
4751     "MUL R0.xyz, fragment.position.y, c[2];\n"
4752     "MAD R0.xyz, fragment.position.x, c[1], R0;\n"
4753     "ADD R0.xyz, R0, c[3];\n"
4754     "RCP R0.z, R0.z;\n"
4755     "MUL R0.xy, R0, R0.z;\n"
4756     "MUL R0.xy, R0, c[0];\n"
4757     "ADD R0.x, R0, R0.y;\n"
4758     "MUL R0.zw, fragment.position.xyxy, c[4].xyxy;\n"
4759     "TEX R1, R0.zwzw, texture[0], 2D;\n"
4760     "MUL R0.x, R0, c[0].z;\n"
4761     "TEX R0, R0, texture[1], 1D;\n"
4762     "MUL R2.xyz, R0.w, R1;\n"
4763     "MAD R3.xyz, R0, R1.w, R2;\n"
4764     "ADD R2.w, -R1, c[5].x;\n"
4765     "MAD R2.xyz, -R0.w, R1.w, R3;\n"
4766     "MUL R4.xyz, R0.w, R2;\n"
4767     "MAX R2.xyz, R0, c[5].y;\n"
4768     "MUL R5.xyz, R0, R2.w;\n"
4769     "ADD R3.w, -R0, c[5].x;\n"
4770     "RCP R2.x, R2.x;\n"
4771     "RCP R2.y, R2.y;\n"
4772     "RCP R2.z, R2.z;\n"
4773     "MAD R2.xyz, R4, R2, R5;\n"
4774     "MUL R4.xyz, R1, R3.w;\n"
4775     "MAD R1.xyz, R1, R3.w, R2;\n"
4776     "MAD R0.xyz, R0, R2.w, R4;\n"
4777     "MUL R2.x, R0.w, R1.w;\n"
4778     "ADD R2.w, R0, R1;\n"
4779     "ADD R1.xyz, R1, -R0;\n"
4780     "SGE R2.xyz, R3, R2.x;\n"
4781     "MAD result.color.xyz, R2, R1, R0;\n"
4782     "MAD result.color.w, -R0, R1, R2;\n"
4783     "END\n"
4784     ;
4785 
4786 static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_LINEAR_COMPOSITION_MODES_HARDLIGHT_NOMASK =
4787     "!!ARBfp1.0\n"
4788     "PARAM c[6] = { program.local[0..4],\n"
4789     "		{ 2, 1 } };\n"
4790     "TEMP R0;\n"
4791     "TEMP R1;\n"
4792     "TEMP R2;\n"
4793     "TEMP R3;\n"
4794     "TEMP R4;\n"
4795     "MUL R0.xyz, fragment.position.y, c[2];\n"
4796     "MAD R0.xyz, fragment.position.x, c[1], R0;\n"
4797     "ADD R0.xyz, R0, c[3];\n"
4798     "RCP R0.z, R0.z;\n"
4799     "MUL R0.xy, R0, R0.z;\n"
4800     "MUL R0.xy, R0, c[0];\n"
4801     "ADD R0.x, R0, R0.y;\n"
4802     "MUL R0.x, R0, c[0].z;\n"
4803     "TEX R0, R0, texture[1], 1D;\n"
4804     "MUL R1.xy, fragment.position, c[4];\n"
4805     "TEX R1, R1, texture[0], 2D;\n"
4806     "ADD R2.w, -R1, c[5].y;\n"
4807     "ADD R3.xyz, R0.w, -R0;\n"
4808     "ADD R2.xyz, R1.w, -R1;\n"
4809     "MUL R2.xyz, R2, R3;\n"
4810     "MUL R2.xyz, R2, c[5].x;\n"
4811     "MAD R2.xyz, R0.w, R1.w, -R2;\n"
4812     "MAD R2.xyz, R0, R2.w, R2;\n"
4813     "MUL R4.xyz, R0, R2.w;\n"
4814     "MUL R3.xyz, R0, R1;\n"
4815     "MUL R0.xyz, R0, c[5].x;\n"
4816     "ADD R2.w, -R0, c[5].y;\n"
4817     "MAD R3.xyz, R3, c[5].x, R4;\n"
4818     "MAD R3.xyz, R1, R2.w, R3;\n"
4819     "MAD R1.xyz, R1, R2.w, R2;\n"
4820     "ADD R2.x, R0.w, R1.w;\n"
4821     "ADD R1.xyz, R1, -R3;\n"
4822     "SGE R0.xyz, R0, R0.w;\n"
4823     "MAD result.color.xyz, R0, R1, R3;\n"
4824     "MAD result.color.w, -R0, R1, R2.x;\n"
4825     "END\n"
4826     ;
4827 
4828 static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_LINEAR_COMPOSITION_MODES_SOFTLIGHT_NOMASK =
4829     "!!ARBfp1.0\n"
4830     "PARAM c[7] = { program.local[0..4],\n"
4831     "		{ 1, 2, 9.9999997e-006, 4 },\n"
4832     "		{ 16, 12, 3 } };\n"
4833     "TEMP R0;\n"
4834     "TEMP R1;\n"
4835     "TEMP R2;\n"
4836     "TEMP R3;\n"
4837     "TEMP R4;\n"
4838     "TEMP R5;\n"
4839     "TEMP R6;\n"
4840     "MUL R0.xyz, fragment.position.y, c[2];\n"
4841     "MAD R0.xyz, fragment.position.x, c[1], R0;\n"
4842     "ADD R0.xyz, R0, c[3];\n"
4843     "RCP R0.z, R0.z;\n"
4844     "MUL R0.xy, R0, R0.z;\n"
4845     "MUL R0.xy, R0, c[0];\n"
4846     "ADD R0.x, R0, R0.y;\n"
4847     "MUL R1.xy, fragment.position, c[4];\n"
4848     "TEX R1, R1, texture[0], 2D;\n"
4849     "MAX R0.z, R1.w, c[5];\n"
4850     "RCP R0.z, R0.z;\n"
4851     "MUL R3.xyz, R1, R0.z;\n"
4852     "MAD R2.xyz, R3, c[6].x, -c[6].y;\n"
4853     "MUL R0.x, R0, c[0].z;\n"
4854     "TEX R0, R0, texture[1], 1D;\n"
4855     "MAD R4.xyz, R3, R2, c[6].z;\n"
4856     "MAD R2.xyz, R0, c[5].y, -R0.w;\n"
4857     "MUL R5.xyz, R1.w, R2;\n"
4858     "MUL R6.xyz, R5, R4;\n"
4859     "RSQ R2.w, R3.x;\n"
4860     "RCP R4.x, R2.w;\n"
4861     "RSQ R2.w, R3.y;\n"
4862     "RSQ R3.w, R3.z;\n"
4863     "RCP R4.y, R2.w;\n"
4864     "RCP R4.z, R3.w;\n"
4865     "ADD R4.xyz, -R3, R4;\n"
4866     "MUL R6.xyz, R3, R6;\n"
4867     "MUL R4.xyz, R5, R4;\n"
4868     "ADD R3.xyz, -R3, c[5].x;\n"
4869     "MAD R2.xyz, R2, R3, R0.w;\n"
4870     "MUL R3.xyz, R0, c[5].y;\n"
4871     "MAD R5.xyz, R0.w, R1, R6;\n"
4872     "MAD R4.xyz, R0.w, R1, R4;\n"
4873     "ADD R6.xyz, R4, -R5;\n"
4874     "MUL R4.xyz, R1, c[5].w;\n"
4875     "SGE R4.xyz, R4, R1.w;\n"
4876     "MAD R4.xyz, R4, R6, R5;\n"
4877     "MAD R4.xyz, -R1, R2, R4;\n"
4878     "MUL R2.xyz, R1, R2;\n"
4879     "SGE R3.xyz, R3, R0.w;\n"
4880     "MAD R2.xyz, R3, R4, R2;\n"
4881     "ADD R2.w, -R1, c[5].x;\n"
4882     "MAD R2.xyz, R0, R2.w, R2;\n"
4883     "ADD R0.x, R0.w, R1.w;\n"
4884     "ADD R0.y, -R0.w, c[5].x;\n"
4885     "MAD result.color.xyz, R1, R0.y, R2;\n"
4886     "MAD result.color.w, -R0, R1, R0.x;\n"
4887     "END\n"
4888     ;
4889 
4890 static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_LINEAR_COMPOSITION_MODES_DIFFERENCE_NOMASK =
4891     "!!ARBfp1.0\n"
4892     "PARAM c[6] = { program.local[0..4],\n"
4893     "		{ 2 } };\n"
4894     "TEMP R0;\n"
4895     "TEMP R1;\n"
4896     "TEMP R2;\n"
4897     "TEMP R3;\n"
4898     "MUL R0.xyz, fragment.position.y, c[2];\n"
4899     "MAD R0.xyz, fragment.position.x, c[1], R0;\n"
4900     "ADD R0.xyz, R0, c[3];\n"
4901     "RCP R0.z, R0.z;\n"
4902     "MUL R0.xy, R0, R0.z;\n"
4903     "MUL R0.xy, R0, c[0];\n"
4904     "ADD R0.x, R0, R0.y;\n"
4905     "MUL R0.zw, fragment.position.xyxy, c[4].xyxy;\n"
4906     "TEX R1, R0.zwzw, texture[0], 2D;\n"
4907     "MUL R0.x, R0, c[0].z;\n"
4908     "TEX R0, R0, texture[1], 1D;\n"
4909     "MUL R2.xyz, R0, R1.w;\n"
4910     "MUL R3.xyz, R0.w, R1;\n"
4911     "ADD R0.xyz, R0, R1;\n"
4912     "MIN R2.xyz, R2, R3;\n"
4913     "ADD R1.x, R0.w, R1.w;\n"
4914     "MAD result.color.xyz, -R2, c[5].x, R0;\n"
4915     "MAD result.color.w, -R0, R1, R1.x;\n"
4916     "END\n"
4917     ;
4918 
4919 static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_LINEAR_COMPOSITION_MODES_EXCLUSION_NOMASK =
4920     "!!ARBfp1.0\n"
4921     "PARAM c[6] = { program.local[0..4],\n"
4922     "		{ 2, 1 } };\n"
4923     "TEMP R0;\n"
4924     "TEMP R1;\n"
4925     "TEMP R2;\n"
4926     "TEMP R3;\n"
4927     "MUL R0.xyz, fragment.position.y, c[2];\n"
4928     "MAD R0.xyz, fragment.position.x, c[1], R0;\n"
4929     "ADD R0.xyz, R0, c[3];\n"
4930     "RCP R0.z, R0.z;\n"
4931     "MUL R0.xy, R0, R0.z;\n"
4932     "MUL R0.xy, R0, c[0];\n"
4933     "ADD R0.x, R0, R0.y;\n"
4934     "MUL R0.zw, fragment.position.xyxy, c[4].xyxy;\n"
4935     "TEX R1, R0.zwzw, texture[0], 2D;\n"
4936     "MUL R0.x, R0, c[0].z;\n"
4937     "TEX R0, R0, texture[1], 1D;\n"
4938     "MUL R2.xyz, R0.w, R1;\n"
4939     "MAD R3.xyz, R0, R1.w, R2;\n"
4940     "MUL R2.xyz, R0, R1;\n"
4941     "MAD R2.xyz, -R2, c[5].x, R3;\n"
4942     "ADD R2.w, -R1, c[5].y;\n"
4943     "MAD R0.xyz, R0, R2.w, R2;\n"
4944     "ADD R2.x, R0.w, R1.w;\n"
4945     "ADD R2.y, -R0.w, c[5];\n"
4946     "MAD result.color.xyz, R1, R2.y, R0;\n"
4947     "MAD result.color.w, -R0, R1, R2.x;\n"
4948     "END\n"
4949     ;
4950 
4951 static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_LINEAR_COMPOSITION_MODE_BLEND_MODE_MASK =
4952     "!!ARBfp1.0\n"
4953     "PARAM c[7] = { program.local[0..6] };\n"
4954     "TEMP R0;\n"
4955     "TEMP R1;\n"
4956     "MUL R0.xyz, fragment.position.y, c[2];\n"
4957     "MAD R0.xyz, fragment.position.x, c[1], R0;\n"
4958     "ADD R0.xyz, R0, c[3];\n"
4959     "RCP R0.z, R0.z;\n"
4960     "MUL R0.zw, R0.xyxy, R0.z;\n"
4961     "MUL R0.zw, R0, c[0].xyxy;\n"
4962     "ADD R1.x, R0.z, R0.w;\n"
4963     "ADD R0.xy, fragment.position, c[5];\n"
4964     "MUL R0.xy, R0, c[4];\n"
4965     "TEX R0, R0, texture[0], 2D;\n"
4966     "DP4 R1.y, R0, c[6];\n"
4967     "MUL R1.x, R1, c[0].z;\n"
4968     "TEX R0, R1, texture[1], 1D;\n"
4969     "MUL result.color, R0, R1.y;\n"
4970     "END\n"
4971     ;
4972 
4973 static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_LINEAR_COMPOSITION_MODE_BLEND_MODE_NOMASK =
4974     "!!ARBfp1.0\n"
4975     "PARAM c[4] = { program.local[0..3] };\n"
4976     "TEMP R0;\n"
4977     "MUL R0.xyz, fragment.position.y, c[2];\n"
4978     "MAD R0.xyz, fragment.position.x, c[1], R0;\n"
4979     "ADD R0.xyz, R0, c[3];\n"
4980     "RCP R0.z, R0.z;\n"
4981     "MUL R0.xy, R0, R0.z;\n"
4982     "MUL R0.xy, R0, c[0];\n"
4983     "ADD R0.x, R0, R0.y;\n"
4984     "MUL R0.x, R0, c[0].z;\n"
4985     "TEX result.color, R0, texture[0], 1D;\n"
4986     "END\n"
4987     ;
4988 
4989 static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_TEXTURE_COMPOSITION_MODES_SIMPLE_PORTER_DUFF =
4990     "!!ARBfp1.0\n"
4991     "PARAM c[11] = { program.local[0..9],\n"
4992     "		{ 1 } };\n"
4993     "TEMP R0;\n"
4994     "TEMP R1;\n"
4995     "TEMP R2;\n"
4996     "TEMP R3;\n"
4997     "MUL R0.xyz, fragment.position.y, c[2];\n"
4998     "MAD R0.xyz, fragment.position.x, c[1], R0;\n"
4999     "ADD R1.xyz, R0, c[3];\n"
5000     "RCP R0.z, R1.z;\n"
5001     "MUL R1.xy, R1, R0.z;\n"
5002     "MUL R0.xy, fragment.position, c[7];\n"
5003     "TEX R0, R0, texture[0], 2D;\n"
5004     "MUL R1.xy, R1, c[0];\n"
5005     "TEX R1, R1, texture[2], 2D;\n"
5006     "MUL R2.xyz, R0, c[4].y;\n"
5007     "MUL R3.xyz, R1.w, R2;\n"
5008     "MUL R2.xyz, R1, c[4].x;\n"
5009     "MAD R2.xyz, R0.w, R2, R3;\n"
5010     "ADD R3.xy, fragment.position, c[8];\n"
5011     "ADD R2.w, -R0, c[10].x;\n"
5012     "MUL R1.xyz, R1, c[5].y;\n"
5013     "MAD R2.xyz, R2.w, R1, R2;\n"
5014     "MUL R1.xyz, R0, c[5].z;\n"
5015     "ADD R3.z, -R1.w, c[10].x;\n"
5016     "MAD R2.xyz, R3.z, R1, R2;\n"
5017     "MUL R1.y, R1.w, R2.w;\n"
5018     "MUL R1.x, R1.w, R0.w;\n"
5019     "MUL R1.z, R0.w, R3;\n"
5020     "DP3 R2.w, R1, c[5];\n"
5021     "MUL R3.xy, R3, c[6];\n"
5022     "TEX R1, R3, texture[1], 2D;\n"
5023     "ADD R2, R2, -R0;\n"
5024     "DP4 R1.x, R1, c[9];\n"
5025     "MAD result.color, R1.x, R2, R0;\n"
5026     "END\n"
5027     ;
5028 
5029 static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_TEXTURE_COMPOSITION_MODES_MULTIPLY =
5030     "!!ARBfp1.0\n"
5031     "PARAM c[9] = { program.local[0..7],\n"
5032     "		{ 1 } };\n"
5033     "TEMP R0;\n"
5034     "TEMP R1;\n"
5035     "TEMP R2;\n"
5036     "MUL R0.xyz, fragment.position.y, c[2];\n"
5037     "MAD R0.xyz, fragment.position.x, c[1], R0;\n"
5038     "ADD R1.xyz, R0, c[3];\n"
5039     "RCP R0.z, R1.z;\n"
5040     "MUL R1.xy, R1, R0.z;\n"
5041     "MUL R0.xy, fragment.position, c[5];\n"
5042     "TEX R0, R0, texture[0], 2D;\n"
5043     "MUL R1.xy, R1, c[0];\n"
5044     "TEX R1, R1, texture[2], 2D;\n"
5045     "ADD R2.x, -R0.w, c[8];\n"
5046     "MUL R2.xyz, R1, R2.x;\n"
5047     "MAD R1.xyz, R1, R0, R2;\n"
5048     "ADD R2.x, -R1.w, c[8];\n"
5049     "MAD R2.xyz, R0, R2.x, R1;\n"
5050     "ADD R1.z, R1.w, R0.w;\n"
5051     "MAD R2.w, -R1, R0, R1.z;\n"
5052     "ADD R1.xy, fragment.position, c[6];\n"
5053     "MUL R1.xy, R1, c[4];\n"
5054     "TEX R1, R1, texture[1], 2D;\n"
5055     "ADD R2, R2, -R0;\n"
5056     "DP4 R1.x, R1, c[7];\n"
5057     "MAD result.color, R1.x, R2, R0;\n"
5058     "END\n"
5059     ;
5060 
5061 static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_TEXTURE_COMPOSITION_MODES_SCREEN =
5062     "!!ARBfp1.0\n"
5063     "PARAM c[8] = { program.local[0..7] };\n"
5064     "TEMP R0;\n"
5065     "TEMP R1;\n"
5066     "TEMP R2;\n"
5067     "TEMP R3;\n"
5068     "MUL R0.xyz, fragment.position.y, c[2];\n"
5069     "MAD R0.xyz, fragment.position.x, c[1], R0;\n"
5070     "ADD R0.xyz, R0, c[3];\n"
5071     "RCP R0.z, R0.z;\n"
5072     "MUL R0.xy, R0, R0.z;\n"
5073     "MUL R0.zw, R0.xyxy, c[0].xyxy;\n"
5074     "ADD R3.xy, fragment.position, c[6];\n"
5075     "TEX R1, R0.zwzw, texture[2], 2D;\n"
5076     "MUL R0.xy, fragment.position, c[5];\n"
5077     "TEX R0, R0, texture[0], 2D;\n"
5078     "ADD R2, R1, R0;\n"
5079     "MAD R2, -R1, R0, R2;\n"
5080     "MUL R3.xy, R3, c[4];\n"
5081     "TEX R1, R3, texture[1], 2D;\n"
5082     "ADD R2, R2, -R0;\n"
5083     "DP4 R1.x, R1, c[7];\n"
5084     "MAD result.color, R1.x, R2, R0;\n"
5085     "END\n"
5086     ;
5087 
5088 static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_TEXTURE_COMPOSITION_MODES_OVERLAY =
5089     "!!ARBfp1.0\n"
5090     "PARAM c[9] = { program.local[0..7],\n"
5091     "		{ 2, 1 } };\n"
5092     "TEMP R0;\n"
5093     "TEMP R1;\n"
5094     "TEMP R2;\n"
5095     "TEMP R3;\n"
5096     "TEMP R4;\n"
5097     "MUL R0.xyz, fragment.position.y, c[2];\n"
5098     "MAD R0.xyz, fragment.position.x, c[1], R0;\n"
5099     "ADD R0.xyz, R0, c[3];\n"
5100     "RCP R0.z, R0.z;\n"
5101     "MUL R0.xy, R0, R0.z;\n"
5102     "MUL R0.xy, R0, c[0];\n"
5103     "TEX R0, R0, texture[2], 2D;\n"
5104     "MUL R1.xy, fragment.position, c[5];\n"
5105     "TEX R1, R1, texture[0], 2D;\n"
5106     "ADD R2.w, -R1, c[8].y;\n"
5107     "ADD R3.xyz, R0.w, -R0;\n"
5108     "ADD R2.xyz, R1.w, -R1;\n"
5109     "MUL R2.xyz, R2, R3;\n"
5110     "MUL R2.xyz, R2, c[8].x;\n"
5111     "MAD R2.xyz, R0.w, R1.w, -R2;\n"
5112     "MUL R4.xyz, R0, R2.w;\n"
5113     "MUL R3.xyz, R0, R1;\n"
5114     "MAD R0.xyz, R0, R2.w, R2;\n"
5115     "ADD R2.x, -R0.w, c[8].y;\n"
5116     "MAD R3.xyz, R3, c[8].x, R4;\n"
5117     "MAD R3.xyz, R1, R2.x, R3;\n"
5118     "MAD R0.xyz, R1, R2.x, R0;\n"
5119     "MUL R2.xyz, R1, c[8].x;\n"
5120     "ADD R0.xyz, R0, -R3;\n"
5121     "SGE R2.xyz, R2, R1.w;\n"
5122     "MAD R2.xyz, R2, R0, R3;\n"
5123     "ADD R0.z, R0.w, R1.w;\n"
5124     "MAD R2.w, -R0, R1, R0.z;\n"
5125     "ADD R0.xy, fragment.position, c[6];\n"
5126     "MUL R0.xy, R0, c[4];\n"
5127     "TEX R0, R0, texture[1], 2D;\n"
5128     "ADD R2, R2, -R1;\n"
5129     "DP4 R0.x, R0, c[7];\n"
5130     "MAD result.color, R0.x, R2, R1;\n"
5131     "END\n"
5132     ;
5133 
5134 static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_TEXTURE_COMPOSITION_MODES_DARKEN =
5135     "!!ARBfp1.0\n"
5136     "PARAM c[9] = { program.local[0..7],\n"
5137     "		{ 1 } };\n"
5138     "TEMP R0;\n"
5139     "TEMP R1;\n"
5140     "TEMP R2;\n"
5141     "TEMP R3;\n"
5142     "MUL R0.xyz, fragment.position.y, c[2];\n"
5143     "MAD R0.xyz, fragment.position.x, c[1], R0;\n"
5144     "ADD R0.xyz, R0, c[3];\n"
5145     "RCP R0.z, R0.z;\n"
5146     "MUL R0.zw, R0.xyxy, R0.z;\n"
5147     "MUL R1.xy, R0.zwzw, c[0];\n"
5148     "MUL R0.xy, fragment.position, c[5];\n"
5149     "TEX R0, R0, texture[0], 2D;\n"
5150     "TEX R1, R1, texture[2], 2D;\n"
5151     "MUL R3.xyz, R1.w, R0;\n"
5152     "MUL R2.xyz, R1, R0.w;\n"
5153     "MIN R2.xyz, R2, R3;\n"
5154     "ADD R2.w, -R0, c[8].x;\n"
5155     "MAD R1.xyz, R1, R2.w, R2;\n"
5156     "ADD R2.x, -R1.w, c[8];\n"
5157     "MAD R2.xyz, R0, R2.x, R1;\n"
5158     "ADD R1.z, R1.w, R0.w;\n"
5159     "MAD R2.w, -R1, R0, R1.z;\n"
5160     "ADD R1.xy, fragment.position, c[6];\n"
5161     "MUL R1.xy, R1, c[4];\n"
5162     "TEX R1, R1, texture[1], 2D;\n"
5163     "ADD R2, R2, -R0;\n"
5164     "DP4 R1.x, R1, c[7];\n"
5165     "MAD result.color, R1.x, R2, R0;\n"
5166     "END\n"
5167     ;
5168 
5169 static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_TEXTURE_COMPOSITION_MODES_LIGHTEN =
5170     "!!ARBfp1.0\n"
5171     "PARAM c[9] = { program.local[0..7],\n"
5172     "		{ 1 } };\n"
5173     "TEMP R0;\n"
5174     "TEMP R1;\n"
5175     "TEMP R2;\n"
5176     "TEMP R3;\n"
5177     "MUL R0.xyz, fragment.position.y, c[2];\n"
5178     "MAD R0.xyz, fragment.position.x, c[1], R0;\n"
5179     "ADD R0.xyz, R0, c[3];\n"
5180     "RCP R0.z, R0.z;\n"
5181     "MUL R0.zw, R0.xyxy, R0.z;\n"
5182     "MUL R1.xy, R0.zwzw, c[0];\n"
5183     "MUL R0.xy, fragment.position, c[5];\n"
5184     "TEX R0, R0, texture[0], 2D;\n"
5185     "TEX R1, R1, texture[2], 2D;\n"
5186     "MUL R3.xyz, R1.w, R0;\n"
5187     "MUL R2.xyz, R1, R0.w;\n"
5188     "MAX R2.xyz, R2, R3;\n"
5189     "ADD R2.w, -R0, c[8].x;\n"
5190     "MAD R1.xyz, R1, R2.w, R2;\n"
5191     "ADD R2.x, -R1.w, c[8];\n"
5192     "MAD R2.xyz, R0, R2.x, R1;\n"
5193     "ADD R1.z, R1.w, R0.w;\n"
5194     "MAD R2.w, -R1, R0, R1.z;\n"
5195     "ADD R1.xy, fragment.position, c[6];\n"
5196     "MUL R1.xy, R1, c[4];\n"
5197     "TEX R1, R1, texture[1], 2D;\n"
5198     "ADD R2, R2, -R0;\n"
5199     "DP4 R1.x, R1, c[7];\n"
5200     "MAD result.color, R1.x, R2, R0;\n"
5201     "END\n"
5202     ;
5203 
5204 static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_TEXTURE_COMPOSITION_MODES_COLORDODGE =
5205     "!!ARBfp1.0\n"
5206     "PARAM c[9] = { program.local[0..7],\n"
5207     "		{ 1, 1e-006 } };\n"
5208     "TEMP R0;\n"
5209     "TEMP R1;\n"
5210     "TEMP R2;\n"
5211     "TEMP R3;\n"
5212     "TEMP R4;\n"
5213     "MUL R0.xyz, fragment.position.y, c[2];\n"
5214     "MAD R0.xyz, fragment.position.x, c[1], R0;\n"
5215     "ADD R0.xyz, R0, c[3];\n"
5216     "RCP R0.z, R0.z;\n"
5217     "MUL R0.xy, R0, R0.z;\n"
5218     "MUL R0.xy, R0, c[0];\n"
5219     "TEX R0, R0, texture[2], 2D;\n"
5220     "MAX R1.x, R0.w, c[8].y;\n"
5221     "RCP R1.x, R1.x;\n"
5222     "MAD R2.xyz, -R0, R1.x, c[8].x;\n"
5223     "MAX R2.xyz, R2, c[8].y;\n"
5224     "MUL R1.xy, fragment.position, c[5];\n"
5225     "TEX R1, R1, texture[0], 2D;\n"
5226     "ADD R2.w, -R0, c[8].x;\n"
5227     "MUL R3.xyz, R1, R2.w;\n"
5228     "ADD R2.w, -R1, c[8].x;\n"
5229     "MAD R4.xyz, R0, R2.w, R3;\n"
5230     "MUL R3.xyz, R0.w, R1;\n"
5231     "MUL R2.w, R0, R1;\n"
5232     "MAD R0.xyz, R0, R1.w, R3;\n"
5233     "SGE R0.xyz, R0, R2.w;\n"
5234     "RCP R2.x, R2.x;\n"
5235     "RCP R2.y, R2.y;\n"
5236     "RCP R2.z, R2.z;\n"
5237     "MAD R2.xyz, R3, R2, R4;\n"
5238     "MAD R4.xyz, R0.w, R1.w, R4;\n"
5239     "ADD R4.xyz, R4, -R2;\n"
5240     "MAD R2.xyz, R0, R4, R2;\n"
5241     "ADD R0.z, R0.w, R1.w;\n"
5242     "MAD R2.w, -R0, R1, R0.z;\n"
5243     "ADD R0.xy, fragment.position, c[6];\n"
5244     "MUL R0.xy, R0, c[4];\n"
5245     "TEX R0, R0, texture[1], 2D;\n"
5246     "ADD R2, R2, -R1;\n"
5247     "DP4 R0.x, R0, c[7];\n"
5248     "MAD result.color, R0.x, R2, R1;\n"
5249     "END\n"
5250     ;
5251 
5252 static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_TEXTURE_COMPOSITION_MODES_COLORBURN =
5253     "!!ARBfp1.0\n"
5254     "PARAM c[9] = { program.local[0..7],\n"
5255     "		{ 1, 9.9999997e-006 } };\n"
5256     "TEMP R0;\n"
5257     "TEMP R1;\n"
5258     "TEMP R2;\n"
5259     "TEMP R3;\n"
5260     "TEMP R4;\n"
5261     "TEMP R5;\n"
5262     "MUL R0.xyz, fragment.position.y, c[2];\n"
5263     "MAD R0.xyz, fragment.position.x, c[1], R0;\n"
5264     "ADD R0.xyz, R0, c[3];\n"
5265     "RCP R0.z, R0.z;\n"
5266     "MUL R0.xy, R0, R0.z;\n"
5267     "MUL R0.zw, fragment.position.xyxy, c[5].xyxy;\n"
5268     "TEX R1, R0.zwzw, texture[0], 2D;\n"
5269     "MUL R0.xy, R0, c[0];\n"
5270     "TEX R0, R0, texture[2], 2D;\n"
5271     "MUL R2.xyz, R0.w, R1;\n"
5272     "MAD R3.xyz, R0, R1.w, R2;\n"
5273     "MAD R2.xyz, -R0.w, R1.w, R3;\n"
5274     "MUL R4.xyz, R0.w, R2;\n"
5275     "MAX R2.xyz, R0, c[8].y;\n"
5276     "ADD R2.w, -R1, c[8].x;\n"
5277     "MUL R5.xyz, R0, R2.w;\n"
5278     "ADD R3.w, -R0, c[8].x;\n"
5279     "RCP R2.x, R2.x;\n"
5280     "RCP R2.y, R2.y;\n"
5281     "RCP R2.z, R2.z;\n"
5282     "MAD R2.xyz, R4, R2, R5;\n"
5283     "MUL R4.xyz, R1, R3.w;\n"
5284     "MAD R0.xyz, R0, R2.w, R4;\n"
5285     "MUL R2.w, R0, R1;\n"
5286     "MAD R2.xyz, R1, R3.w, R2;\n"
5287     "ADD R2.xyz, R2, -R0;\n"
5288     "SGE R3.xyz, R3, R2.w;\n"
5289     "MAD R2.xyz, R3, R2, R0;\n"
5290     "ADD R0.z, R0.w, R1.w;\n"
5291     "MAD R2.w, -R0, R1, R0.z;\n"
5292     "ADD R0.xy, fragment.position, c[6];\n"
5293     "MUL R0.xy, R0, c[4];\n"
5294     "TEX R0, R0, texture[1], 2D;\n"
5295     "ADD R2, R2, -R1;\n"
5296     "DP4 R0.x, R0, c[7];\n"
5297     "MAD result.color, R0.x, R2, R1;\n"
5298     "END\n"
5299     ;
5300 
5301 static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_TEXTURE_COMPOSITION_MODES_HARDLIGHT =
5302     "!!ARBfp1.0\n"
5303     "PARAM c[9] = { program.local[0..7],\n"
5304     "		{ 2, 1 } };\n"
5305     "TEMP R0;\n"
5306     "TEMP R1;\n"
5307     "TEMP R2;\n"
5308     "TEMP R3;\n"
5309     "TEMP R4;\n"
5310     "MUL R0.xyz, fragment.position.y, c[2];\n"
5311     "MAD R0.xyz, fragment.position.x, c[1], R0;\n"
5312     "ADD R0.xyz, R0, c[3];\n"
5313     "RCP R0.z, R0.z;\n"
5314     "MUL R0.xy, R0, R0.z;\n"
5315     "MUL R0.xy, R0, c[0];\n"
5316     "TEX R0, R0, texture[2], 2D;\n"
5317     "MUL R1.xy, fragment.position, c[5];\n"
5318     "TEX R1, R1, texture[0], 2D;\n"
5319     "ADD R2.w, -R1, c[8].y;\n"
5320     "ADD R3.xyz, R0.w, -R0;\n"
5321     "ADD R2.xyz, R1.w, -R1;\n"
5322     "MUL R2.xyz, R2, R3;\n"
5323     "MUL R2.xyz, R2, c[8].x;\n"
5324     "MAD R2.xyz, R0.w, R1.w, -R2;\n"
5325     "MUL R4.xyz, R0, R2.w;\n"
5326     "MAD R2.xyz, R0, R2.w, R2;\n"
5327     "MUL R3.xyz, R0, R1;\n"
5328     "ADD R2.w, -R0, c[8].y;\n"
5329     "MAD R3.xyz, R3, c[8].x, R4;\n"
5330     "MUL R0.xyz, R0, c[8].x;\n"
5331     "SGE R0.xyz, R0, R0.w;\n"
5332     "MAD R3.xyz, R1, R2.w, R3;\n"
5333     "MAD R2.xyz, R1, R2.w, R2;\n"
5334     "ADD R2.xyz, R2, -R3;\n"
5335     "MAD R2.xyz, R0, R2, R3;\n"
5336     "ADD R0.z, R0.w, R1.w;\n"
5337     "MAD R2.w, -R0, R1, R0.z;\n"
5338     "ADD R0.xy, fragment.position, c[6];\n"
5339     "MUL R0.xy, R0, c[4];\n"
5340     "TEX R0, R0, texture[1], 2D;\n"
5341     "ADD R2, R2, -R1;\n"
5342     "DP4 R0.x, R0, c[7];\n"
5343     "MAD result.color, R0.x, R2, R1;\n"
5344     "END\n"
5345     ;
5346 
5347 static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_TEXTURE_COMPOSITION_MODES_SOFTLIGHT =
5348     "!!ARBfp1.0\n"
5349     "PARAM c[10] = { program.local[0..7],\n"
5350     "		{ 1, 2, 9.9999997e-006, 4 },\n"
5351     "		{ 16, 12, 3 } };\n"
5352     "TEMP R0;\n"
5353     "TEMP R1;\n"
5354     "TEMP R2;\n"
5355     "TEMP R3;\n"
5356     "TEMP R4;\n"
5357     "TEMP R5;\n"
5358     "TEMP R6;\n"
5359     "MUL R0.xyz, fragment.position.y, c[2];\n"
5360     "MUL R1.xy, fragment.position, c[5];\n"
5361     "TEX R1, R1, texture[0], 2D;\n"
5362     "MAD R0.xyz, fragment.position.x, c[1], R0;\n"
5363     "ADD R0.xyz, R0, c[3];\n"
5364     "RCP R0.z, R0.z;\n"
5365     "MUL R0.xy, R0, R0.z;\n"
5366     "MAX R0.w, R1, c[8].z;\n"
5367     "RCP R0.w, R0.w;\n"
5368     "MUL R3.xyz, R1, R0.w;\n"
5369     "MAD R2.xyz, R3, c[9].x, -c[9].y;\n"
5370     "MUL R0.xy, R0, c[0];\n"
5371     "TEX R0, R0, texture[2], 2D;\n"
5372     "MAD R4.xyz, R3, R2, c[9].z;\n"
5373     "MAD R2.xyz, R0, c[8].y, -R0.w;\n"
5374     "MUL R5.xyz, R1.w, R2;\n"
5375     "MUL R6.xyz, R5, R4;\n"
5376     "RSQ R2.w, R3.x;\n"
5377     "RCP R4.x, R2.w;\n"
5378     "RSQ R2.w, R3.y;\n"
5379     "RSQ R3.w, R3.z;\n"
5380     "RCP R4.y, R2.w;\n"
5381     "RCP R4.z, R3.w;\n"
5382     "ADD R4.xyz, -R3, R4;\n"
5383     "MUL R6.xyz, R3, R6;\n"
5384     "MUL R4.xyz, R5, R4;\n"
5385     "ADD R3.xyz, -R3, c[8].x;\n"
5386     "MAD R2.xyz, R2, R3, R0.w;\n"
5387     "MUL R3.xyz, R0, c[8].y;\n"
5388     "MAD R5.xyz, R0.w, R1, R6;\n"
5389     "MAD R4.xyz, R0.w, R1, R4;\n"
5390     "ADD R6.xyz, R4, -R5;\n"
5391     "MUL R4.xyz, R1, c[8].w;\n"
5392     "SGE R4.xyz, R4, R1.w;\n"
5393     "MAD R4.xyz, R4, R6, R5;\n"
5394     "MAD R4.xyz, -R1, R2, R4;\n"
5395     "SGE R3.xyz, R3, R0.w;\n"
5396     "MUL R2.xyz, R1, R2;\n"
5397     "ADD R2.w, -R1, c[8].x;\n"
5398     "MAD R2.xyz, R3, R4, R2;\n"
5399     "MAD R2.xyz, R0, R2.w, R2;\n"
5400     "ADD R0.x, -R0.w, c[8];\n"
5401     "MAD R2.xyz, R1, R0.x, R2;\n"
5402     "ADD R0.z, R0.w, R1.w;\n"
5403     "MAD R2.w, -R0, R1, R0.z;\n"
5404     "ADD R0.xy, fragment.position, c[6];\n"
5405     "MUL R0.xy, R0, c[4];\n"
5406     "TEX R0, R0, texture[1], 2D;\n"
5407     "ADD R2, R2, -R1;\n"
5408     "DP4 R0.x, R0, c[7];\n"
5409     "MAD result.color, R0.x, R2, R1;\n"
5410     "END\n"
5411     ;
5412 
5413 static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_TEXTURE_COMPOSITION_MODES_DIFFERENCE =
5414     "!!ARBfp1.0\n"
5415     "PARAM c[9] = { program.local[0..7],\n"
5416     "		{ 2 } };\n"
5417     "TEMP R0;\n"
5418     "TEMP R1;\n"
5419     "TEMP R2;\n"
5420     "TEMP R3;\n"
5421     "MUL R0.xyz, fragment.position.y, c[2];\n"
5422     "MAD R0.xyz, fragment.position.x, c[1], R0;\n"
5423     "ADD R0.xyz, R0, c[3];\n"
5424     "RCP R0.z, R0.z;\n"
5425     "MUL R0.zw, R0.xyxy, R0.z;\n"
5426     "MUL R1.xy, R0.zwzw, c[0];\n"
5427     "MUL R0.xy, fragment.position, c[5];\n"
5428     "TEX R0, R0, texture[0], 2D;\n"
5429     "TEX R1, R1, texture[2], 2D;\n"
5430     "ADD R2.xyz, R1, R0;\n"
5431     "MUL R3.xyz, R1.w, R0;\n"
5432     "MUL R1.xyz, R1, R0.w;\n"
5433     "MIN R1.xyz, R1, R3;\n"
5434     "MAD R2.xyz, -R1, c[8].x, R2;\n"
5435     "ADD R1.z, R1.w, R0.w;\n"
5436     "MAD R2.w, -R1, R0, R1.z;\n"
5437     "ADD R1.xy, fragment.position, c[6];\n"
5438     "MUL R1.xy, R1, c[4];\n"
5439     "TEX R1, R1, texture[1], 2D;\n"
5440     "ADD R2, R2, -R0;\n"
5441     "DP4 R1.x, R1, c[7];\n"
5442     "MAD result.color, R1.x, R2, R0;\n"
5443     "END\n"
5444     ;
5445 
5446 static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_TEXTURE_COMPOSITION_MODES_EXCLUSION =
5447     "!!ARBfp1.0\n"
5448     "PARAM c[9] = { program.local[0..7],\n"
5449     "		{ 2, 1 } };\n"
5450     "TEMP R0;\n"
5451     "TEMP R1;\n"
5452     "TEMP R2;\n"
5453     "TEMP R3;\n"
5454     "MUL R0.xyz, fragment.position.y, c[2];\n"
5455     "MAD R0.xyz, fragment.position.x, c[1], R0;\n"
5456     "ADD R0.xyz, R0, c[3];\n"
5457     "RCP R0.z, R0.z;\n"
5458     "MUL R0.zw, R0.xyxy, R0.z;\n"
5459     "MUL R1.xy, R0.zwzw, c[0];\n"
5460     "MUL R0.xy, fragment.position, c[5];\n"
5461     "TEX R0, R0, texture[0], 2D;\n"
5462     "TEX R1, R1, texture[2], 2D;\n"
5463     "MUL R2.xyz, R1.w, R0;\n"
5464     "MAD R3.xyz, R1, R0.w, R2;\n"
5465     "MUL R2.xyz, R1, R0;\n"
5466     "MAD R2.xyz, -R2, c[8].x, R3;\n"
5467     "ADD R2.w, -R0, c[8].y;\n"
5468     "MAD R1.xyz, R1, R2.w, R2;\n"
5469     "ADD R2.x, -R1.w, c[8].y;\n"
5470     "MAD R2.xyz, R0, R2.x, R1;\n"
5471     "ADD R1.z, R1.w, R0.w;\n"
5472     "MAD R2.w, -R1, R0, R1.z;\n"
5473     "ADD R1.xy, fragment.position, c[6];\n"
5474     "MUL R1.xy, R1, c[4];\n"
5475     "TEX R1, R1, texture[1], 2D;\n"
5476     "ADD R2, R2, -R0;\n"
5477     "DP4 R1.x, R1, c[7];\n"
5478     "MAD result.color, R1.x, R2, R0;\n"
5479     "END\n"
5480     ;
5481 
5482 static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_TEXTURE_COMPOSITION_MODES_SIMPLE_PORTER_DUFF_NOMASK =
5483     "!!ARBfp1.0\n"
5484     "PARAM c[8] = { program.local[0..6],\n"
5485     "		{ 1 } };\n"
5486     "TEMP R0;\n"
5487     "TEMP R1;\n"
5488     "TEMP R2;\n"
5489     "TEMP R3;\n"
5490     "MUL R0.xyz, fragment.position.y, c[2];\n"
5491     "MAD R0.xyz, fragment.position.x, c[1], R0;\n"
5492     "ADD R0.xyz, R0, c[3];\n"
5493     "RCP R0.z, R0.z;\n"
5494     "MUL R0.xy, R0, R0.z;\n"
5495     "MUL R1.xy, fragment.position, c[6];\n"
5496     "TEX R1, R1, texture[0], 2D;\n"
5497     "MUL R2.xyz, R1, c[4].y;\n"
5498     "MUL R0.xy, R0, c[0];\n"
5499     "TEX R0, R0, texture[1], 2D;\n"
5500     "MUL R3.xyz, R0.w, R2;\n"
5501     "MUL R2.xyz, R0, c[4].x;\n"
5502     "MAD R2.xyz, R1.w, R2, R3;\n"
5503     "ADD R2.w, -R1, c[7].x;\n"
5504     "MUL R0.xyz, R0, c[5].y;\n"
5505     "MAD R0.xyz, R2.w, R0, R2;\n"
5506     "ADD R2.x, -R0.w, c[7];\n"
5507     "MUL R1.xyz, R1, c[5].z;\n"
5508     "MAD result.color.xyz, R2.x, R1, R0;\n"
5509     "MUL R0.x, R0.w, R1.w;\n"
5510     "MUL R0.z, R1.w, R2.x;\n"
5511     "MUL R0.y, R0.w, R2.w;\n"
5512     "DP3 result.color.w, R0, c[5];\n"
5513     "END\n"
5514     ;
5515 
5516 static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_TEXTURE_COMPOSITION_MODES_MULTIPLY_NOMASK =
5517     "!!ARBfp1.0\n"
5518     "PARAM c[6] = { program.local[0..4],\n"
5519     "		{ 1 } };\n"
5520     "TEMP R0;\n"
5521     "TEMP R1;\n"
5522     "TEMP R2;\n"
5523     "MUL R0.xyz, fragment.position.y, c[2];\n"
5524     "MAD R0.xyz, fragment.position.x, c[1], R0;\n"
5525     "ADD R0.xyz, R0, c[3];\n"
5526     "RCP R0.z, R0.z;\n"
5527     "MUL R0.xy, R0, R0.z;\n"
5528     "MUL R1.xy, fragment.position, c[4];\n"
5529     "TEX R1, R1, texture[0], 2D;\n"
5530     "MUL R0.xy, R0, c[0];\n"
5531     "TEX R0, R0, texture[1], 2D;\n"
5532     "ADD R2.x, -R1.w, c[5];\n"
5533     "MUL R2.xyz, R0, R2.x;\n"
5534     "MAD R0.xyz, R0, R1, R2;\n"
5535     "ADD R2.x, R0.w, R1.w;\n"
5536     "ADD R2.y, -R0.w, c[5].x;\n"
5537     "MAD result.color.xyz, R1, R2.y, R0;\n"
5538     "MAD result.color.w, -R0, R1, R2.x;\n"
5539     "END\n"
5540     ;
5541 
5542 static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_TEXTURE_COMPOSITION_MODES_SCREEN_NOMASK =
5543     "!!ARBfp1.0\n"
5544     "PARAM c[5] = { program.local[0..4] };\n"
5545     "TEMP R0;\n"
5546     "TEMP R1;\n"
5547     "TEMP R2;\n"
5548     "MUL R0.xyz, fragment.position.y, c[2];\n"
5549     "MAD R0.xyz, fragment.position.x, c[1], R0;\n"
5550     "ADD R0.xyz, R0, c[3];\n"
5551     "RCP R0.z, R0.z;\n"
5552     "MUL R0.xy, R0, R0.z;\n"
5553     "MUL R0.zw, fragment.position.xyxy, c[4].xyxy;\n"
5554     "TEX R1, R0.zwzw, texture[0], 2D;\n"
5555     "MUL R0.xy, R0, c[0];\n"
5556     "TEX R0, R0, texture[1], 2D;\n"
5557     "ADD R2, R0, R1;\n"
5558     "MAD result.color, -R0, R1, R2;\n"
5559     "END\n"
5560     ;
5561 
5562 static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_TEXTURE_COMPOSITION_MODES_OVERLAY_NOMASK =
5563     "!!ARBfp1.0\n"
5564     "PARAM c[6] = { program.local[0..4],\n"
5565     "		{ 2, 1 } };\n"
5566     "TEMP R0;\n"
5567     "TEMP R1;\n"
5568     "TEMP R2;\n"
5569     "TEMP R3;\n"
5570     "MUL R0.xyz, fragment.position.y, c[2];\n"
5571     "MAD R0.xyz, fragment.position.x, c[1], R0;\n"
5572     "ADD R0.xyz, R0, c[3];\n"
5573     "RCP R0.z, R0.z;\n"
5574     "MUL R0.xy, R0, R0.z;\n"
5575     "MUL R0.xy, R0, c[0];\n"
5576     "TEX R0, R0, texture[1], 2D;\n"
5577     "MUL R1.xy, fragment.position, c[4];\n"
5578     "TEX R1, R1, texture[0], 2D;\n"
5579     "ADD R3.xyz, R0.w, -R0;\n"
5580     "ADD R2.xyz, R1.w, -R1;\n"
5581     "MUL R2.xyz, R2, R3;\n"
5582     "ADD R2.w, -R1, c[5].y;\n"
5583     "MUL R2.xyz, R2, c[5].x;\n"
5584     "MAD R2.xyz, R0.w, R1.w, -R2;\n"
5585     "MAD R2.xyz, R0, R2.w, R2;\n"
5586     "MUL R3.xyz, R0, R2.w;\n"
5587     "MUL R0.xyz, R0, R1;\n"
5588     "ADD R2.w, -R0, c[5].y;\n"
5589     "MAD R0.xyz, R0, c[5].x, R3;\n"
5590     "MAD R0.xyz, R1, R2.w, R0;\n"
5591     "MAD R2.xyz, R1, R2.w, R2;\n"
5592     "MUL R1.xyz, R1, c[5].x;\n"
5593     "ADD R2.w, R0, R1;\n"
5594     "ADD R2.xyz, R2, -R0;\n"
5595     "SGE R1.xyz, R1, R1.w;\n"
5596     "MAD result.color.xyz, R1, R2, R0;\n"
5597     "MAD result.color.w, -R0, R1, R2;\n"
5598     "END\n"
5599     ;
5600 
5601 static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_TEXTURE_COMPOSITION_MODES_DARKEN_NOMASK =
5602     "!!ARBfp1.0\n"
5603     "PARAM c[6] = { program.local[0..4],\n"
5604     "		{ 1 } };\n"
5605     "TEMP R0;\n"
5606     "TEMP R1;\n"
5607     "TEMP R2;\n"
5608     "TEMP R3;\n"
5609     "MUL R0.xyz, fragment.position.y, c[2];\n"
5610     "MAD R0.xyz, fragment.position.x, c[1], R0;\n"
5611     "ADD R0.xyz, R0, c[3];\n"
5612     "RCP R0.z, R0.z;\n"
5613     "MUL R0.xy, R0, R0.z;\n"
5614     "MUL R0.zw, fragment.position.xyxy, c[4].xyxy;\n"
5615     "TEX R1, R0.zwzw, texture[0], 2D;\n"
5616     "MUL R0.xy, R0, c[0];\n"
5617     "TEX R0, R0, texture[1], 2D;\n"
5618     "MUL R2.xyz, R0, R1.w;\n"
5619     "MUL R3.xyz, R0.w, R1;\n"
5620     "MIN R2.xyz, R2, R3;\n"
5621     "ADD R2.w, -R1, c[5].x;\n"
5622     "MAD R0.xyz, R0, R2.w, R2;\n"
5623     "ADD R2.x, R0.w, R1.w;\n"
5624     "ADD R2.y, -R0.w, c[5].x;\n"
5625     "MAD result.color.xyz, R1, R2.y, R0;\n"
5626     "MAD result.color.w, -R0, R1, R2.x;\n"
5627     "END\n"
5628     ;
5629 
5630 static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_TEXTURE_COMPOSITION_MODES_LIGHTEN_NOMASK =
5631     "!!ARBfp1.0\n"
5632     "PARAM c[6] = { program.local[0..4],\n"
5633     "		{ 1 } };\n"
5634     "TEMP R0;\n"
5635     "TEMP R1;\n"
5636     "TEMP R2;\n"
5637     "TEMP R3;\n"
5638     "MUL R0.xyz, fragment.position.y, c[2];\n"
5639     "MAD R0.xyz, fragment.position.x, c[1], R0;\n"
5640     "ADD R0.xyz, R0, c[3];\n"
5641     "RCP R0.z, R0.z;\n"
5642     "MUL R0.xy, R0, R0.z;\n"
5643     "MUL R0.zw, fragment.position.xyxy, c[4].xyxy;\n"
5644     "TEX R1, R0.zwzw, texture[0], 2D;\n"
5645     "MUL R0.xy, R0, c[0];\n"
5646     "TEX R0, R0, texture[1], 2D;\n"
5647     "MUL R2.xyz, R0, R1.w;\n"
5648     "MUL R3.xyz, R0.w, R1;\n"
5649     "MAX R2.xyz, R2, R3;\n"
5650     "ADD R2.w, -R1, c[5].x;\n"
5651     "MAD R0.xyz, R0, R2.w, R2;\n"
5652     "ADD R2.x, R0.w, R1.w;\n"
5653     "ADD R2.y, -R0.w, c[5].x;\n"
5654     "MAD result.color.xyz, R1, R2.y, R0;\n"
5655     "MAD result.color.w, -R0, R1, R2.x;\n"
5656     "END\n"
5657     ;
5658 
5659 static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_TEXTURE_COMPOSITION_MODES_COLORDODGE_NOMASK =
5660     "!!ARBfp1.0\n"
5661     "PARAM c[6] = { program.local[0..4],\n"
5662     "		{ 1, 1e-006 } };\n"
5663     "TEMP R0;\n"
5664     "TEMP R1;\n"
5665     "TEMP R2;\n"
5666     "TEMP R3;\n"
5667     "MUL R0.xyz, fragment.position.y, c[2];\n"
5668     "MAD R0.xyz, fragment.position.x, c[1], R0;\n"
5669     "ADD R0.xyz, R0, c[3];\n"
5670     "RCP R0.z, R0.z;\n"
5671     "MUL R0.xy, R0, R0.z;\n"
5672     "MUL R0.xy, R0, c[0];\n"
5673     "TEX R0, R0, texture[1], 2D;\n"
5674     "MAX R1.x, R0.w, c[5].y;\n"
5675     "RCP R1.x, R1.x;\n"
5676     "MAD R3.xyz, -R0, R1.x, c[5].x;\n"
5677     "MAX R3.xyz, R3, c[5].y;\n"
5678     "MUL R1.xy, fragment.position, c[4];\n"
5679     "TEX R1, R1, texture[0], 2D;\n"
5680     "ADD R2.x, -R0.w, c[5];\n"
5681     "MUL R2.xyz, R1, R2.x;\n"
5682     "ADD R2.w, -R1, c[5].x;\n"
5683     "MAD R2.xyz, R0, R2.w, R2;\n"
5684     "MUL R1.xyz, R0.w, R1;\n"
5685     "MAD R0.xyz, R0, R1.w, R1;\n"
5686     "MUL R2.w, R0, R1;\n"
5687     "RCP R3.x, R3.x;\n"
5688     "RCP R3.y, R3.y;\n"
5689     "RCP R3.z, R3.z;\n"
5690     "MAD R3.xyz, R1, R3, R2;\n"
5691     "MAD R2.xyz, R0.w, R1.w, R2;\n"
5692     "ADD R1.x, R0.w, R1.w;\n"
5693     "ADD R2.xyz, R2, -R3;\n"
5694     "SGE R0.xyz, R0, R2.w;\n"
5695     "MAD result.color.xyz, R0, R2, R3;\n"
5696     "MAD result.color.w, -R0, R1, R1.x;\n"
5697     "END\n"
5698     ;
5699 
5700 static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_TEXTURE_COMPOSITION_MODES_COLORBURN_NOMASK =
5701     "!!ARBfp1.0\n"
5702     "PARAM c[6] = { program.local[0..4],\n"
5703     "		{ 1, 9.9999997e-006 } };\n"
5704     "TEMP R0;\n"
5705     "TEMP R1;\n"
5706     "TEMP R2;\n"
5707     "TEMP R3;\n"
5708     "TEMP R4;\n"
5709     "TEMP R5;\n"
5710     "MUL R0.xyz, fragment.position.y, c[2];\n"
5711     "MAD R0.xyz, fragment.position.x, c[1], R0;\n"
5712     "ADD R0.xyz, R0, c[3];\n"
5713     "RCP R0.z, R0.z;\n"
5714     "MUL R0.xy, R0, R0.z;\n"
5715     "MUL R0.zw, fragment.position.xyxy, c[4].xyxy;\n"
5716     "TEX R1, R0.zwzw, texture[0], 2D;\n"
5717     "MUL R0.xy, R0, c[0];\n"
5718     "TEX R0, R0, texture[1], 2D;\n"
5719     "MUL R2.xyz, R0.w, R1;\n"
5720     "MAD R3.xyz, R0, R1.w, R2;\n"
5721     "ADD R2.w, -R1, c[5].x;\n"
5722     "MAD R2.xyz, -R0.w, R1.w, R3;\n"
5723     "MUL R4.xyz, R0.w, R2;\n"
5724     "MAX R2.xyz, R0, c[5].y;\n"
5725     "MUL R5.xyz, R0, R2.w;\n"
5726     "ADD R3.w, -R0, c[5].x;\n"
5727     "RCP R2.x, R2.x;\n"
5728     "RCP R2.y, R2.y;\n"
5729     "RCP R2.z, R2.z;\n"
5730     "MAD R2.xyz, R4, R2, R5;\n"
5731     "MUL R4.xyz, R1, R3.w;\n"
5732     "MAD R1.xyz, R1, R3.w, R2;\n"
5733     "MAD R0.xyz, R0, R2.w, R4;\n"
5734     "MUL R2.x, R0.w, R1.w;\n"
5735     "ADD R2.w, R0, R1;\n"
5736     "ADD R1.xyz, R1, -R0;\n"
5737     "SGE R2.xyz, R3, R2.x;\n"
5738     "MAD result.color.xyz, R2, R1, R0;\n"
5739     "MAD result.color.w, -R0, R1, R2;\n"
5740     "END\n"
5741     ;
5742 
5743 static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_TEXTURE_COMPOSITION_MODES_HARDLIGHT_NOMASK =
5744     "!!ARBfp1.0\n"
5745     "PARAM c[6] = { program.local[0..4],\n"
5746     "		{ 2, 1 } };\n"
5747     "TEMP R0;\n"
5748     "TEMP R1;\n"
5749     "TEMP R2;\n"
5750     "TEMP R3;\n"
5751     "TEMP R4;\n"
5752     "MUL R0.xyz, fragment.position.y, c[2];\n"
5753     "MAD R0.xyz, fragment.position.x, c[1], R0;\n"
5754     "ADD R0.xyz, R0, c[3];\n"
5755     "RCP R0.z, R0.z;\n"
5756     "MUL R0.xy, R0, R0.z;\n"
5757     "MUL R0.xy, R0, c[0];\n"
5758     "TEX R0, R0, texture[1], 2D;\n"
5759     "MUL R1.xy, fragment.position, c[4];\n"
5760     "TEX R1, R1, texture[0], 2D;\n"
5761     "ADD R2.w, -R1, c[5].y;\n"
5762     "ADD R3.xyz, R0.w, -R0;\n"
5763     "ADD R2.xyz, R1.w, -R1;\n"
5764     "MUL R2.xyz, R2, R3;\n"
5765     "MUL R2.xyz, R2, c[5].x;\n"
5766     "MAD R2.xyz, R0.w, R1.w, -R2;\n"
5767     "MAD R2.xyz, R0, R2.w, R2;\n"
5768     "MUL R4.xyz, R0, R2.w;\n"
5769     "MUL R3.xyz, R0, R1;\n"
5770     "MUL R0.xyz, R0, c[5].x;\n"
5771     "ADD R2.w, -R0, c[5].y;\n"
5772     "MAD R3.xyz, R3, c[5].x, R4;\n"
5773     "MAD R3.xyz, R1, R2.w, R3;\n"
5774     "MAD R1.xyz, R1, R2.w, R2;\n"
5775     "ADD R2.x, R0.w, R1.w;\n"
5776     "ADD R1.xyz, R1, -R3;\n"
5777     "SGE R0.xyz, R0, R0.w;\n"
5778     "MAD result.color.xyz, R0, R1, R3;\n"
5779     "MAD result.color.w, -R0, R1, R2.x;\n"
5780     "END\n"
5781     ;
5782 
5783 static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_TEXTURE_COMPOSITION_MODES_SOFTLIGHT_NOMASK =
5784     "!!ARBfp1.0\n"
5785     "PARAM c[7] = { program.local[0..4],\n"
5786     "		{ 1, 2, 9.9999997e-006, 4 },\n"
5787     "		{ 16, 12, 3 } };\n"
5788     "TEMP R0;\n"
5789     "TEMP R1;\n"
5790     "TEMP R2;\n"
5791     "TEMP R3;\n"
5792     "TEMP R4;\n"
5793     "TEMP R5;\n"
5794     "TEMP R6;\n"
5795     "MUL R0.xyz, fragment.position.y, c[2];\n"
5796     "MUL R1.xy, fragment.position, c[4];\n"
5797     "TEX R1, R1, texture[0], 2D;\n"
5798     "MAD R0.xyz, fragment.position.x, c[1], R0;\n"
5799     "ADD R0.xyz, R0, c[3];\n"
5800     "RCP R0.z, R0.z;\n"
5801     "MUL R0.xy, R0, R0.z;\n"
5802     "MAX R0.w, R1, c[5].z;\n"
5803     "RCP R0.w, R0.w;\n"
5804     "MUL R3.xyz, R1, R0.w;\n"
5805     "MAD R2.xyz, R3, c[6].x, -c[6].y;\n"
5806     "MUL R0.xy, R0, c[0];\n"
5807     "TEX R0, R0, texture[1], 2D;\n"
5808     "MAD R4.xyz, R3, R2, c[6].z;\n"
5809     "MAD R2.xyz, R0, c[5].y, -R0.w;\n"
5810     "MUL R5.xyz, R1.w, R2;\n"
5811     "MUL R6.xyz, R5, R4;\n"
5812     "RSQ R2.w, R3.x;\n"
5813     "RCP R4.x, R2.w;\n"
5814     "RSQ R2.w, R3.y;\n"
5815     "RSQ R3.w, R3.z;\n"
5816     "RCP R4.y, R2.w;\n"
5817     "RCP R4.z, R3.w;\n"
5818     "ADD R4.xyz, -R3, R4;\n"
5819     "MUL R6.xyz, R3, R6;\n"
5820     "MUL R4.xyz, R5, R4;\n"
5821     "ADD R3.xyz, -R3, c[5].x;\n"
5822     "MAD R2.xyz, R2, R3, R0.w;\n"
5823     "MUL R3.xyz, R0, c[5].y;\n"
5824     "MAD R5.xyz, R0.w, R1, R6;\n"
5825     "MAD R4.xyz, R0.w, R1, R4;\n"
5826     "ADD R6.xyz, R4, -R5;\n"
5827     "MUL R4.xyz, R1, c[5].w;\n"
5828     "SGE R4.xyz, R4, R1.w;\n"
5829     "MAD R4.xyz, R4, R6, R5;\n"
5830     "MAD R4.xyz, -R1, R2, R4;\n"
5831     "MUL R2.xyz, R1, R2;\n"
5832     "SGE R3.xyz, R3, R0.w;\n"
5833     "MAD R2.xyz, R3, R4, R2;\n"
5834     "ADD R2.w, -R1, c[5].x;\n"
5835     "MAD R2.xyz, R0, R2.w, R2;\n"
5836     "ADD R0.x, R0.w, R1.w;\n"
5837     "ADD R0.y, -R0.w, c[5].x;\n"
5838     "MAD result.color.xyz, R1, R0.y, R2;\n"
5839     "MAD result.color.w, -R0, R1, R0.x;\n"
5840     "END\n"
5841     ;
5842 
5843 static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_TEXTURE_COMPOSITION_MODES_DIFFERENCE_NOMASK =
5844     "!!ARBfp1.0\n"
5845     "PARAM c[6] = { program.local[0..4],\n"
5846     "		{ 2 } };\n"
5847     "TEMP R0;\n"
5848     "TEMP R1;\n"
5849     "TEMP R2;\n"
5850     "TEMP R3;\n"
5851     "MUL R0.xyz, fragment.position.y, c[2];\n"
5852     "MAD R0.xyz, fragment.position.x, c[1], R0;\n"
5853     "ADD R0.xyz, R0, c[3];\n"
5854     "RCP R0.z, R0.z;\n"
5855     "MUL R0.xy, R0, R0.z;\n"
5856     "MUL R0.zw, fragment.position.xyxy, c[4].xyxy;\n"
5857     "TEX R1, R0.zwzw, texture[0], 2D;\n"
5858     "MUL R0.xy, R0, c[0];\n"
5859     "TEX R0, R0, texture[1], 2D;\n"
5860     "MUL R2.xyz, R0, R1.w;\n"
5861     "MUL R3.xyz, R0.w, R1;\n"
5862     "ADD R0.xyz, R0, R1;\n"
5863     "MIN R2.xyz, R2, R3;\n"
5864     "ADD R1.x, R0.w, R1.w;\n"
5865     "MAD result.color.xyz, -R2, c[5].x, R0;\n"
5866     "MAD result.color.w, -R0, R1, R1.x;\n"
5867     "END\n"
5868     ;
5869 
5870 static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_TEXTURE_COMPOSITION_MODES_EXCLUSION_NOMASK =
5871     "!!ARBfp1.0\n"
5872     "PARAM c[6] = { program.local[0..4],\n"
5873     "		{ 2, 1 } };\n"
5874     "TEMP R0;\n"
5875     "TEMP R1;\n"
5876     "TEMP R2;\n"
5877     "TEMP R3;\n"
5878     "MUL R0.xyz, fragment.position.y, c[2];\n"
5879     "MAD R0.xyz, fragment.position.x, c[1], R0;\n"
5880     "ADD R0.xyz, R0, c[3];\n"
5881     "RCP R0.z, R0.z;\n"
5882     "MUL R0.xy, R0, R0.z;\n"
5883     "MUL R0.zw, fragment.position.xyxy, c[4].xyxy;\n"
5884     "TEX R1, R0.zwzw, texture[0], 2D;\n"
5885     "MUL R0.xy, R0, c[0];\n"
5886     "TEX R0, R0, texture[1], 2D;\n"
5887     "MUL R2.xyz, R0.w, R1;\n"
5888     "MAD R3.xyz, R0, R1.w, R2;\n"
5889     "MUL R2.xyz, R0, R1;\n"
5890     "MAD R2.xyz, -R2, c[5].x, R3;\n"
5891     "ADD R2.w, -R1, c[5].y;\n"
5892     "MAD R0.xyz, R0, R2.w, R2;\n"
5893     "ADD R2.x, R0.w, R1.w;\n"
5894     "ADD R2.y, -R0.w, c[5];\n"
5895     "MAD result.color.xyz, R1, R2.y, R0;\n"
5896     "MAD result.color.w, -R0, R1, R2.x;\n"
5897     "END\n"
5898     ;
5899 
5900 static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_TEXTURE_COMPOSITION_MODE_BLEND_MODE_MASK =
5901     "!!ARBfp1.0\n"
5902     "PARAM c[7] = { program.local[0..6] };\n"
5903     "TEMP R0;\n"
5904     "TEMP R1;\n"
5905     "MUL R0.xyz, fragment.position.y, c[2];\n"
5906     "MAD R0.xyz, fragment.position.x, c[1], R0;\n"
5907     "ADD R1.xyz, R0, c[3];\n"
5908     "RCP R0.z, R1.z;\n"
5909     "MUL R1.xy, R1, R0.z;\n"
5910     "ADD R0.xy, fragment.position, c[5];\n"
5911     "MUL R0.xy, R0, c[4];\n"
5912     "TEX R0, R0, texture[0], 2D;\n"
5913     "DP4 R1.z, R0, c[6];\n"
5914     "MUL R1.xy, R1, c[0];\n"
5915     "TEX R0, R1, texture[1], 2D;\n"
5916     "MUL result.color, R0, R1.z;\n"
5917     "END\n"
5918     ;
5919 
5920 static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_TEXTURE_COMPOSITION_MODE_BLEND_MODE_NOMASK =
5921     "!!ARBfp1.0\n"
5922     "PARAM c[4] = { program.local[0..3] };\n"
5923     "TEMP R0;\n"
5924     "MUL R0.xyz, fragment.position.y, c[2];\n"
5925     "MAD R0.xyz, fragment.position.x, c[1], R0;\n"
5926     "ADD R0.xyz, R0, c[3];\n"
5927     "RCP R0.z, R0.z;\n"
5928     "MUL R0.xy, R0, R0.z;\n"
5929     "MUL R0.xy, R0, c[0];\n"
5930     "TEX result.color, R0, texture[0], 2D;\n"
5931     "END\n"
5932     ;
5933 
5934 static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_PATTERN_COMPOSITION_MODES_SIMPLE_PORTER_DUFF =
5935     "!!ARBfp1.0\n"
5936     "PARAM c[11] = { program.local[0..9],\n"
5937     "		{ 1 } };\n"
5938     "TEMP R0;\n"
5939     "TEMP R1;\n"
5940     "TEMP R2;\n"
5941     "TEMP R3;\n"
5942     "MUL R0.xyz, fragment.position.y, c[2];\n"
5943     "MAD R0.xyz, fragment.position.x, c[1], R0;\n"
5944     "ADD R0.xyz, R0, c[3];\n"
5945     "RCP R0.z, R0.z;\n"
5946     "MUL R0.xy, R0, R0.z;\n"
5947     "MUL R0.zw, R0.xyxy, c[0].xyxy;\n"
5948     "TEX R1.x, R0.zwzw, texture[2], 2D;\n"
5949     "MUL R0.xy, fragment.position, c[7];\n"
5950     "TEX R0, R0, texture[0], 2D;\n"
5951     "ADD R1.x, -R1, c[10];\n"
5952     "MUL R1, fragment.color.primary, R1.x;\n"
5953     "MUL R2.xyz, R0, c[4].y;\n"
5954     "MUL R3.xyz, R1.w, R2;\n"
5955     "MUL R2.xyz, R1, c[4].x;\n"
5956     "MAD R2.xyz, R0.w, R2, R3;\n"
5957     "ADD R3.xy, fragment.position, c[8];\n"
5958     "ADD R2.w, -R0, c[10].x;\n"
5959     "MUL R1.xyz, R1, c[5].y;\n"
5960     "MAD R2.xyz, R2.w, R1, R2;\n"
5961     "MUL R1.xyz, R0, c[5].z;\n"
5962     "ADD R3.z, -R1.w, c[10].x;\n"
5963     "MAD R2.xyz, R3.z, R1, R2;\n"
5964     "MUL R1.y, R1.w, R2.w;\n"
5965     "MUL R1.x, R1.w, R0.w;\n"
5966     "MUL R1.z, R0.w, R3;\n"
5967     "DP3 R2.w, R1, c[5];\n"
5968     "MUL R3.xy, R3, c[6];\n"
5969     "TEX R1, R3, texture[1], 2D;\n"
5970     "ADD R2, R2, -R0;\n"
5971     "DP4 R1.x, R1, c[9];\n"
5972     "MAD result.color, R1.x, R2, R0;\n"
5973     "END\n"
5974     ;
5975 
5976 static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_PATTERN_COMPOSITION_MODES_MULTIPLY =
5977     "!!ARBfp1.0\n"
5978     "PARAM c[9] = { program.local[0..7],\n"
5979     "		{ 1 } };\n"
5980     "TEMP R0;\n"
5981     "TEMP R1;\n"
5982     "TEMP R2;\n"
5983     "MUL R0.xyz, fragment.position.y, c[2];\n"
5984     "MAD R0.xyz, fragment.position.x, c[1], R0;\n"
5985     "ADD R0.xyz, R0, c[3];\n"
5986     "RCP R0.z, R0.z;\n"
5987     "MUL R0.xy, R0, R0.z;\n"
5988     "MUL R0.zw, R0.xyxy, c[0].xyxy;\n"
5989     "TEX R1.x, R0.zwzw, texture[2], 2D;\n"
5990     "MUL R0.xy, fragment.position, c[5];\n"
5991     "TEX R0, R0, texture[0], 2D;\n"
5992     "ADD R1.x, -R1, c[8];\n"
5993     "MUL R1, fragment.color.primary, R1.x;\n"
5994     "ADD R2.x, -R0.w, c[8];\n"
5995     "MUL R2.xyz, R1, R2.x;\n"
5996     "MAD R1.xyz, R1, R0, R2;\n"
5997     "ADD R2.x, -R1.w, c[8];\n"
5998     "MAD R2.xyz, R0, R2.x, R1;\n"
5999     "ADD R1.z, R1.w, R0.w;\n"
6000     "MAD R2.w, -R1, R0, R1.z;\n"
6001     "ADD R1.xy, fragment.position, c[6];\n"
6002     "MUL R1.xy, R1, c[4];\n"
6003     "TEX R1, R1, texture[1], 2D;\n"
6004     "ADD R2, R2, -R0;\n"
6005     "DP4 R1.x, R1, c[7];\n"
6006     "MAD result.color, R1.x, R2, R0;\n"
6007     "END\n"
6008     ;
6009 
6010 static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_PATTERN_COMPOSITION_MODES_SCREEN =
6011     "!!ARBfp1.0\n"
6012     "PARAM c[9] = { program.local[0..7],\n"
6013     "		{ 1 } };\n"
6014     "TEMP R0;\n"
6015     "TEMP R1;\n"
6016     "TEMP R2;\n"
6017     "TEMP R3;\n"
6018     "MUL R0.xyz, fragment.position.y, c[2];\n"
6019     "MAD R0.xyz, fragment.position.x, c[1], R0;\n"
6020     "ADD R0.xyz, R0, c[3];\n"
6021     "RCP R0.z, R0.z;\n"
6022     "MUL R0.xy, R0, R0.z;\n"
6023     "MUL R0.xy, R0, c[0];\n"
6024     "TEX R0.x, R0, texture[2], 2D;\n"
6025     "ADD R0.z, -R0.x, c[8].x;\n"
6026     "ADD R3.xy, fragment.position, c[6];\n"
6027     "MUL R1, fragment.color.primary, R0.z;\n"
6028     "MUL R0.xy, fragment.position, c[5];\n"
6029     "TEX R0, R0, texture[0], 2D;\n"
6030     "ADD R2, R1, R0;\n"
6031     "MAD R2, -R1, R0, R2;\n"
6032     "MUL R3.xy, R3, c[4];\n"
6033     "TEX R1, R3, texture[1], 2D;\n"
6034     "ADD R2, R2, -R0;\n"
6035     "DP4 R1.x, R1, c[7];\n"
6036     "MAD result.color, R1.x, R2, R0;\n"
6037     "END\n"
6038     ;
6039 
6040 static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_PATTERN_COMPOSITION_MODES_OVERLAY =
6041     "!!ARBfp1.0\n"
6042     "PARAM c[9] = { program.local[0..7],\n"
6043     "		{ 1, 2 } };\n"
6044     "TEMP R0;\n"
6045     "TEMP R1;\n"
6046     "TEMP R2;\n"
6047     "TEMP R3;\n"
6048     "TEMP R4;\n"
6049     "MUL R0.xyz, fragment.position.y, c[2];\n"
6050     "MAD R0.xyz, fragment.position.x, c[1], R0;\n"
6051     "ADD R0.xyz, R0, c[3];\n"
6052     "RCP R0.z, R0.z;\n"
6053     "MUL R0.xy, R0, R0.z;\n"
6054     "MUL R0.xy, R0, c[0];\n"
6055     "TEX R0.x, R0, texture[2], 2D;\n"
6056     "ADD R0.x, -R0, c[8];\n"
6057     "MUL R1, fragment.color.primary, R0.x;\n"
6058     "MUL R0.zw, fragment.position.xyxy, c[5].xyxy;\n"
6059     "TEX R0, R0.zwzw, texture[0], 2D;\n"
6060     "ADD R2.w, -R0, c[8].x;\n"
6061     "ADD R3.xyz, R1.w, -R1;\n"
6062     "ADD R2.xyz, R0.w, -R0;\n"
6063     "MUL R2.xyz, R2, R3;\n"
6064     "MUL R2.xyz, R2, c[8].y;\n"
6065     "MAD R2.xyz, R1.w, R0.w, -R2;\n"
6066     "MUL R4.xyz, R1, R2.w;\n"
6067     "MUL R3.xyz, R1, R0;\n"
6068     "MAD R1.xyz, R1, R2.w, R2;\n"
6069     "ADD R2.x, -R1.w, c[8];\n"
6070     "MAD R3.xyz, R3, c[8].y, R4;\n"
6071     "MAD R3.xyz, R0, R2.x, R3;\n"
6072     "MAD R1.xyz, R0, R2.x, R1;\n"
6073     "MUL R2.xyz, R0, c[8].y;\n"
6074     "ADD R1.xyz, R1, -R3;\n"
6075     "SGE R2.xyz, R2, R0.w;\n"
6076     "MAD R2.xyz, R2, R1, R3;\n"
6077     "ADD R1.z, R1.w, R0.w;\n"
6078     "MAD R2.w, -R1, R0, R1.z;\n"
6079     "ADD R1.xy, fragment.position, c[6];\n"
6080     "MUL R1.xy, R1, c[4];\n"
6081     "TEX R1, R1, texture[1], 2D;\n"
6082     "ADD R2, R2, -R0;\n"
6083     "DP4 R1.x, R1, c[7];\n"
6084     "MAD result.color, R1.x, R2, R0;\n"
6085     "END\n"
6086     ;
6087 
6088 static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_PATTERN_COMPOSITION_MODES_DARKEN =
6089     "!!ARBfp1.0\n"
6090     "PARAM c[9] = { program.local[0..7],\n"
6091     "		{ 1 } };\n"
6092     "TEMP R0;\n"
6093     "TEMP R1;\n"
6094     "TEMP R2;\n"
6095     "TEMP R3;\n"
6096     "MUL R0.xyz, fragment.position.y, c[2];\n"
6097     "MAD R0.xyz, fragment.position.x, c[1], R0;\n"
6098     "ADD R0.xyz, R0, c[3];\n"
6099     "RCP R0.z, R0.z;\n"
6100     "MUL R0.xy, R0, R0.z;\n"
6101     "MUL R0.xy, R0, c[0];\n"
6102     "TEX R1.x, R0, texture[2], 2D;\n"
6103     "MUL R0.xy, fragment.position, c[5];\n"
6104     "TEX R0, R0, texture[0], 2D;\n"
6105     "ADD R1.x, -R1, c[8];\n"
6106     "MUL R1, fragment.color.primary, R1.x;\n"
6107     "MUL R3.xyz, R1.w, R0;\n"
6108     "MUL R2.xyz, R1, R0.w;\n"
6109     "MIN R2.xyz, R2, R3;\n"
6110     "ADD R2.w, -R0, c[8].x;\n"
6111     "MAD R1.xyz, R1, R2.w, R2;\n"
6112     "ADD R2.x, -R1.w, c[8];\n"
6113     "MAD R2.xyz, R0, R2.x, R1;\n"
6114     "ADD R1.z, R1.w, R0.w;\n"
6115     "MAD R2.w, -R1, R0, R1.z;\n"
6116     "ADD R1.xy, fragment.position, c[6];\n"
6117     "MUL R1.xy, R1, c[4];\n"
6118     "TEX R1, R1, texture[1], 2D;\n"
6119     "ADD R2, R2, -R0;\n"
6120     "DP4 R1.x, R1, c[7];\n"
6121     "MAD result.color, R1.x, R2, R0;\n"
6122     "END\n"
6123     ;
6124 
6125 static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_PATTERN_COMPOSITION_MODES_LIGHTEN =
6126     "!!ARBfp1.0\n"
6127     "PARAM c[9] = { program.local[0..7],\n"
6128     "		{ 1 } };\n"
6129     "TEMP R0;\n"
6130     "TEMP R1;\n"
6131     "TEMP R2;\n"
6132     "TEMP R3;\n"
6133     "MUL R0.xyz, fragment.position.y, c[2];\n"
6134     "MAD R0.xyz, fragment.position.x, c[1], R0;\n"
6135     "ADD R0.xyz, R0, c[3];\n"
6136     "RCP R0.z, R0.z;\n"
6137     "MUL R0.xy, R0, R0.z;\n"
6138     "MUL R0.xy, R0, c[0];\n"
6139     "TEX R1.x, R0, texture[2], 2D;\n"
6140     "MUL R0.xy, fragment.position, c[5];\n"
6141     "TEX R0, R0, texture[0], 2D;\n"
6142     "ADD R1.x, -R1, c[8];\n"
6143     "MUL R1, fragment.color.primary, R1.x;\n"
6144     "MUL R3.xyz, R1.w, R0;\n"
6145     "MUL R2.xyz, R1, R0.w;\n"
6146     "MAX R2.xyz, R2, R3;\n"
6147     "ADD R2.w, -R0, c[8].x;\n"
6148     "MAD R1.xyz, R1, R2.w, R2;\n"
6149     "ADD R2.x, -R1.w, c[8];\n"
6150     "MAD R2.xyz, R0, R2.x, R1;\n"
6151     "ADD R1.z, R1.w, R0.w;\n"
6152     "MAD R2.w, -R1, R0, R1.z;\n"
6153     "ADD R1.xy, fragment.position, c[6];\n"
6154     "MUL R1.xy, R1, c[4];\n"
6155     "TEX R1, R1, texture[1], 2D;\n"
6156     "ADD R2, R2, -R0;\n"
6157     "DP4 R1.x, R1, c[7];\n"
6158     "MAD result.color, R1.x, R2, R0;\n"
6159     "END\n"
6160     ;
6161 
6162 static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_PATTERN_COMPOSITION_MODES_COLORDODGE =
6163     "!!ARBfp1.0\n"
6164     "PARAM c[9] = { program.local[0..7],\n"
6165     "		{ 1, 1e-006 } };\n"
6166     "TEMP R0;\n"
6167     "TEMP R1;\n"
6168     "TEMP R2;\n"
6169     "TEMP R3;\n"
6170     "TEMP R4;\n"
6171     "MUL R0.xyz, fragment.position.y, c[2];\n"
6172     "MAD R0.xyz, fragment.position.x, c[1], R0;\n"
6173     "ADD R0.xyz, R0, c[3];\n"
6174     "RCP R0.z, R0.z;\n"
6175     "MUL R0.xy, R0, R0.z;\n"
6176     "MUL R0.xy, R0, c[0];\n"
6177     "TEX R0.x, R0, texture[2], 2D;\n"
6178     "ADD R0.x, -R0, c[8];\n"
6179     "MUL R1, fragment.color.primary, R0.x;\n"
6180     "MAX R0.x, R1.w, c[8].y;\n"
6181     "RCP R0.x, R0.x;\n"
6182     "MAD R2.xyz, -R1, R0.x, c[8].x;\n"
6183     "MAX R2.xyz, R2, c[8].y;\n"
6184     "MUL R0.xy, fragment.position, c[5];\n"
6185     "TEX R0, R0, texture[0], 2D;\n"
6186     "ADD R2.w, -R1, c[8].x;\n"
6187     "MUL R3.xyz, R0, R2.w;\n"
6188     "ADD R2.w, -R0, c[8].x;\n"
6189     "MAD R4.xyz, R1, R2.w, R3;\n"
6190     "MUL R3.xyz, R1.w, R0;\n"
6191     "MUL R2.w, R1, R0;\n"
6192     "MAD R1.xyz, R1, R0.w, R3;\n"
6193     "SGE R1.xyz, R1, R2.w;\n"
6194     "RCP R2.x, R2.x;\n"
6195     "RCP R2.y, R2.y;\n"
6196     "RCP R2.z, R2.z;\n"
6197     "MAD R2.xyz, R3, R2, R4;\n"
6198     "MAD R4.xyz, R1.w, R0.w, R4;\n"
6199     "ADD R4.xyz, R4, -R2;\n"
6200     "MAD R2.xyz, R1, R4, R2;\n"
6201     "ADD R1.z, R1.w, R0.w;\n"
6202     "MAD R2.w, -R1, R0, R1.z;\n"
6203     "ADD R1.xy, fragment.position, c[6];\n"
6204     "MUL R1.xy, R1, c[4];\n"
6205     "TEX R1, R1, texture[1], 2D;\n"
6206     "ADD R2, R2, -R0;\n"
6207     "DP4 R1.x, R1, c[7];\n"
6208     "MAD result.color, R1.x, R2, R0;\n"
6209     "END\n"
6210     ;
6211 
6212 static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_PATTERN_COMPOSITION_MODES_COLORBURN =
6213     "!!ARBfp1.0\n"
6214     "PARAM c[9] = { program.local[0..7],\n"
6215     "		{ 1, 9.9999997e-006 } };\n"
6216     "TEMP R0;\n"
6217     "TEMP R1;\n"
6218     "TEMP R2;\n"
6219     "TEMP R3;\n"
6220     "TEMP R4;\n"
6221     "TEMP R5;\n"
6222     "MUL R0.xyz, fragment.position.y, c[2];\n"
6223     "MAD R0.xyz, fragment.position.x, c[1], R0;\n"
6224     "ADD R0.xyz, R0, c[3];\n"
6225     "RCP R0.z, R0.z;\n"
6226     "MUL R0.xy, R0, R0.z;\n"
6227     "MUL R0.xy, R0, c[0];\n"
6228     "TEX R0.x, R0, texture[2], 2D;\n"
6229     "ADD R1.x, -R0, c[8];\n"
6230     "MUL R1, fragment.color.primary, R1.x;\n"
6231     "MUL R0.zw, fragment.position.xyxy, c[5].xyxy;\n"
6232     "TEX R0, R0.zwzw, texture[0], 2D;\n"
6233     "MUL R2.xyz, R1.w, R0;\n"
6234     "MAD R3.xyz, R1, R0.w, R2;\n"
6235     "MAD R2.xyz, -R1.w, R0.w, R3;\n"
6236     "MUL R4.xyz, R1.w, R2;\n"
6237     "MAX R2.xyz, R1, c[8].y;\n"
6238     "ADD R2.w, -R0, c[8].x;\n"
6239     "MUL R5.xyz, R1, R2.w;\n"
6240     "ADD R3.w, -R1, c[8].x;\n"
6241     "RCP R2.x, R2.x;\n"
6242     "RCP R2.y, R2.y;\n"
6243     "RCP R2.z, R2.z;\n"
6244     "MAD R2.xyz, R4, R2, R5;\n"
6245     "MUL R4.xyz, R0, R3.w;\n"
6246     "MAD R1.xyz, R1, R2.w, R4;\n"
6247     "MUL R2.w, R1, R0;\n"
6248     "MAD R2.xyz, R0, R3.w, R2;\n"
6249     "ADD R2.xyz, R2, -R1;\n"
6250     "SGE R3.xyz, R3, R2.w;\n"
6251     "MAD R2.xyz, R3, R2, R1;\n"
6252     "ADD R1.z, R1.w, R0.w;\n"
6253     "MAD R2.w, -R1, R0, R1.z;\n"
6254     "ADD R1.xy, fragment.position, c[6];\n"
6255     "MUL R1.xy, R1, c[4];\n"
6256     "TEX R1, R1, texture[1], 2D;\n"
6257     "ADD R2, R2, -R0;\n"
6258     "DP4 R1.x, R1, c[7];\n"
6259     "MAD result.color, R1.x, R2, R0;\n"
6260     "END\n"
6261     ;
6262 
6263 static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_PATTERN_COMPOSITION_MODES_HARDLIGHT =
6264     "!!ARBfp1.0\n"
6265     "PARAM c[9] = { program.local[0..7],\n"
6266     "		{ 1, 2 } };\n"
6267     "TEMP R0;\n"
6268     "TEMP R1;\n"
6269     "TEMP R2;\n"
6270     "TEMP R3;\n"
6271     "TEMP R4;\n"
6272     "MUL R0.xyz, fragment.position.y, c[2];\n"
6273     "MAD R0.xyz, fragment.position.x, c[1], R0;\n"
6274     "ADD R0.xyz, R0, c[3];\n"
6275     "RCP R0.z, R0.z;\n"
6276     "MUL R0.xy, R0, R0.z;\n"
6277     "MUL R0.xy, R0, c[0];\n"
6278     "TEX R0.x, R0, texture[2], 2D;\n"
6279     "ADD R0.x, -R0, c[8];\n"
6280     "MUL R1, fragment.color.primary, R0.x;\n"
6281     "MUL R0.zw, fragment.position.xyxy, c[5].xyxy;\n"
6282     "TEX R0, R0.zwzw, texture[0], 2D;\n"
6283     "ADD R2.w, -R0, c[8].x;\n"
6284     "ADD R3.xyz, R1.w, -R1;\n"
6285     "ADD R2.xyz, R0.w, -R0;\n"
6286     "MUL R2.xyz, R2, R3;\n"
6287     "MUL R2.xyz, R2, c[8].y;\n"
6288     "MAD R2.xyz, R1.w, R0.w, -R2;\n"
6289     "MUL R4.xyz, R1, R2.w;\n"
6290     "MAD R2.xyz, R1, R2.w, R2;\n"
6291     "MUL R3.xyz, R1, R0;\n"
6292     "ADD R2.w, -R1, c[8].x;\n"
6293     "MAD R3.xyz, R3, c[8].y, R4;\n"
6294     "MUL R1.xyz, R1, c[8].y;\n"
6295     "SGE R1.xyz, R1, R1.w;\n"
6296     "MAD R3.xyz, R0, R2.w, R3;\n"
6297     "MAD R2.xyz, R0, R2.w, R2;\n"
6298     "ADD R2.xyz, R2, -R3;\n"
6299     "MAD R2.xyz, R1, R2, R3;\n"
6300     "ADD R1.z, R1.w, R0.w;\n"
6301     "MAD R2.w, -R1, R0, R1.z;\n"
6302     "ADD R1.xy, fragment.position, c[6];\n"
6303     "MUL R1.xy, R1, c[4];\n"
6304     "TEX R1, R1, texture[1], 2D;\n"
6305     "ADD R2, R2, -R0;\n"
6306     "DP4 R1.x, R1, c[7];\n"
6307     "MAD result.color, R1.x, R2, R0;\n"
6308     "END\n"
6309     ;
6310 
6311 static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_PATTERN_COMPOSITION_MODES_SOFTLIGHT =
6312     "!!ARBfp1.0\n"
6313     "PARAM c[10] = { program.local[0..7],\n"
6314     "		{ 1, 2, 9.9999997e-006, 4 },\n"
6315     "		{ 16, 12, 3 } };\n"
6316     "TEMP R0;\n"
6317     "TEMP R1;\n"
6318     "TEMP R2;\n"
6319     "TEMP R3;\n"
6320     "TEMP R4;\n"
6321     "TEMP R5;\n"
6322     "TEMP R6;\n"
6323     "MUL R0.xyz, fragment.position.y, c[2];\n"
6324     "MAD R0.xyz, fragment.position.x, c[1], R0;\n"
6325     "ADD R1.xyz, R0, c[3];\n"
6326     "RCP R1.z, R1.z;\n"
6327     "MUL R1.xy, R1, R1.z;\n"
6328     "MUL R1.xy, R1, c[0];\n"
6329     "TEX R1.x, R1, texture[2], 2D;\n"
6330     "MUL R0.xy, fragment.position, c[5];\n"
6331     "TEX R0, R0, texture[0], 2D;\n"
6332     "MAX R1.z, R0.w, c[8];\n"
6333     "RCP R1.z, R1.z;\n"
6334     "MUL R3.xyz, R0, R1.z;\n"
6335     "MAD R2.xyz, R3, c[9].x, -c[9].y;\n"
6336     "ADD R1.x, -R1, c[8];\n"
6337     "MUL R1, fragment.color.primary, R1.x;\n"
6338     "MAD R4.xyz, R3, R2, c[9].z;\n"
6339     "MAD R2.xyz, R1, c[8].y, -R1.w;\n"
6340     "MUL R5.xyz, R0.w, R2;\n"
6341     "MUL R6.xyz, R5, R4;\n"
6342     "RSQ R2.w, R3.x;\n"
6343     "RCP R4.x, R2.w;\n"
6344     "RSQ R2.w, R3.y;\n"
6345     "RSQ R3.w, R3.z;\n"
6346     "RCP R4.y, R2.w;\n"
6347     "RCP R4.z, R3.w;\n"
6348     "ADD R4.xyz, -R3, R4;\n"
6349     "MUL R6.xyz, R3, R6;\n"
6350     "MUL R4.xyz, R5, R4;\n"
6351     "ADD R3.xyz, -R3, c[8].x;\n"
6352     "MAD R2.xyz, R2, R3, R1.w;\n"
6353     "MUL R3.xyz, R1, c[8].y;\n"
6354     "MAD R5.xyz, R1.w, R0, R6;\n"
6355     "MAD R4.xyz, R1.w, R0, R4;\n"
6356     "ADD R6.xyz, R4, -R5;\n"
6357     "MUL R4.xyz, R0, c[8].w;\n"
6358     "SGE R4.xyz, R4, R0.w;\n"
6359     "MAD R4.xyz, R4, R6, R5;\n"
6360     "MAD R4.xyz, -R0, R2, R4;\n"
6361     "SGE R3.xyz, R3, R1.w;\n"
6362     "MUL R2.xyz, R0, R2;\n"
6363     "ADD R2.w, -R0, c[8].x;\n"
6364     "MAD R2.xyz, R3, R4, R2;\n"
6365     "MAD R2.xyz, R1, R2.w, R2;\n"
6366     "ADD R1.x, -R1.w, c[8];\n"
6367     "MAD R2.xyz, R0, R1.x, R2;\n"
6368     "ADD R1.z, R1.w, R0.w;\n"
6369     "MAD R2.w, -R1, R0, R1.z;\n"
6370     "ADD R1.xy, fragment.position, c[6];\n"
6371     "MUL R1.xy, R1, c[4];\n"
6372     "TEX R1, R1, texture[1], 2D;\n"
6373     "ADD R2, R2, -R0;\n"
6374     "DP4 R1.x, R1, c[7];\n"
6375     "MAD result.color, R1.x, R2, R0;\n"
6376     "END\n"
6377     ;
6378 
6379 static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_PATTERN_COMPOSITION_MODES_DIFFERENCE =
6380     "!!ARBfp1.0\n"
6381     "PARAM c[9] = { program.local[0..7],\n"
6382     "		{ 1, 2 } };\n"
6383     "TEMP R0;\n"
6384     "TEMP R1;\n"
6385     "TEMP R2;\n"
6386     "TEMP R3;\n"
6387     "MUL R0.xyz, fragment.position.y, c[2];\n"
6388     "MAD R0.xyz, fragment.position.x, c[1], R0;\n"
6389     "ADD R0.xyz, R0, c[3];\n"
6390     "RCP R0.z, R0.z;\n"
6391     "MUL R0.xy, R0, R0.z;\n"
6392     "MUL R0.xy, R0, c[0];\n"
6393     "TEX R1.x, R0, texture[2], 2D;\n"
6394     "MUL R0.xy, fragment.position, c[5];\n"
6395     "ADD R1.x, -R1, c[8];\n"
6396     "TEX R0, R0, texture[0], 2D;\n"
6397     "MUL R1, fragment.color.primary, R1.x;\n"
6398     "ADD R2.xyz, R1, R0;\n"
6399     "MUL R3.xyz, R1.w, R0;\n"
6400     "MUL R1.xyz, R1, R0.w;\n"
6401     "MIN R1.xyz, R1, R3;\n"
6402     "MAD R2.xyz, -R1, c[8].y, R2;\n"
6403     "ADD R1.z, R1.w, R0.w;\n"
6404     "MAD R2.w, -R1, R0, R1.z;\n"
6405     "ADD R1.xy, fragment.position, c[6];\n"
6406     "MUL R1.xy, R1, c[4];\n"
6407     "TEX R1, R1, texture[1], 2D;\n"
6408     "ADD R2, R2, -R0;\n"
6409     "DP4 R1.x, R1, c[7];\n"
6410     "MAD result.color, R1.x, R2, R0;\n"
6411     "END\n"
6412     ;
6413 
6414 static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_PATTERN_COMPOSITION_MODES_EXCLUSION =
6415     "!!ARBfp1.0\n"
6416     "PARAM c[9] = { program.local[0..7],\n"
6417     "		{ 1, 2 } };\n"
6418     "TEMP R0;\n"
6419     "TEMP R1;\n"
6420     "TEMP R2;\n"
6421     "TEMP R3;\n"
6422     "MUL R0.xyz, fragment.position.y, c[2];\n"
6423     "MAD R0.xyz, fragment.position.x, c[1], R0;\n"
6424     "ADD R0.xyz, R0, c[3];\n"
6425     "RCP R0.z, R0.z;\n"
6426     "MUL R0.xy, R0, R0.z;\n"
6427     "MUL R0.xy, R0, c[0];\n"
6428     "TEX R1.x, R0, texture[2], 2D;\n"
6429     "MUL R0.xy, fragment.position, c[5];\n"
6430     "TEX R0, R0, texture[0], 2D;\n"
6431     "ADD R1.x, -R1, c[8];\n"
6432     "MUL R1, fragment.color.primary, R1.x;\n"
6433     "MUL R2.xyz, R1.w, R0;\n"
6434     "MAD R3.xyz, R1, R0.w, R2;\n"
6435     "MUL R2.xyz, R1, R0;\n"
6436     "MAD R2.xyz, -R2, c[8].y, R3;\n"
6437     "ADD R2.w, -R0, c[8].x;\n"
6438     "MAD R1.xyz, R1, R2.w, R2;\n"
6439     "ADD R2.x, -R1.w, c[8];\n"
6440     "MAD R2.xyz, R0, R2.x, R1;\n"
6441     "ADD R1.z, R1.w, R0.w;\n"
6442     "MAD R2.w, -R1, R0, R1.z;\n"
6443     "ADD R1.xy, fragment.position, c[6];\n"
6444     "MUL R1.xy, R1, c[4];\n"
6445     "TEX R1, R1, texture[1], 2D;\n"
6446     "ADD R2, R2, -R0;\n"
6447     "DP4 R1.x, R1, c[7];\n"
6448     "MAD result.color, R1.x, R2, R0;\n"
6449     "END\n"
6450     ;
6451 
6452 static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_PATTERN_COMPOSITION_MODES_SIMPLE_PORTER_DUFF_NOMASK =
6453     "!!ARBfp1.0\n"
6454     "PARAM c[8] = { program.local[0..6],\n"
6455     "		{ 1 } };\n"
6456     "TEMP R0;\n"
6457     "TEMP R1;\n"
6458     "TEMP R2;\n"
6459     "TEMP R3;\n"
6460     "MUL R0.xyz, fragment.position.y, c[2];\n"
6461     "MAD R0.xyz, fragment.position.x, c[1], R0;\n"
6462     "ADD R0.xyz, R0, c[3];\n"
6463     "RCP R0.z, R0.z;\n"
6464     "MUL R0.xy, R0, R0.z;\n"
6465     "MUL R0.xy, R0, c[0];\n"
6466     "TEX R1.x, R0, texture[1], 2D;\n"
6467     "MUL R0.zw, fragment.position.xyxy, c[6].xyxy;\n"
6468     "TEX R0, R0.zwzw, texture[0], 2D;\n"
6469     "MUL R2.xyz, R0, c[4].y;\n"
6470     "ADD R1.x, -R1, c[7];\n"
6471     "MUL R1, fragment.color.primary, R1.x;\n"
6472     "MUL R3.xyz, R1.w, R2;\n"
6473     "MUL R2.xyz, R1, c[4].x;\n"
6474     "MUL R0.xyz, R0, c[5].z;\n"
6475     "MAD R2.xyz, R0.w, R2, R3;\n"
6476     "ADD R2.w, -R0, c[7].x;\n"
6477     "MUL R1.xyz, R1, c[5].y;\n"
6478     "MAD R1.xyz, R2.w, R1, R2;\n"
6479     "ADD R2.x, -R1.w, c[7];\n"
6480     "MAD result.color.xyz, R2.x, R0, R1;\n"
6481     "MUL R0.x, R1.w, R0.w;\n"
6482     "MUL R0.z, R0.w, R2.x;\n"
6483     "MUL R0.y, R1.w, R2.w;\n"
6484     "DP3 result.color.w, R0, c[5];\n"
6485     "END\n"
6486     ;
6487 
6488 static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_PATTERN_COMPOSITION_MODES_MULTIPLY_NOMASK =
6489     "!!ARBfp1.0\n"
6490     "PARAM c[6] = { program.local[0..4],\n"
6491     "		{ 1 } };\n"
6492     "TEMP R0;\n"
6493     "TEMP R1;\n"
6494     "TEMP R2;\n"
6495     "MUL R0.xyz, fragment.position.y, c[2];\n"
6496     "MAD R0.xyz, fragment.position.x, c[1], R0;\n"
6497     "ADD R0.xyz, R0, c[3];\n"
6498     "RCP R0.z, R0.z;\n"
6499     "MUL R0.xy, R0, R0.z;\n"
6500     "MUL R0.xy, R0, c[0];\n"
6501     "TEX R1.x, R0, texture[1], 2D;\n"
6502     "MUL R0.zw, fragment.position.xyxy, c[4].xyxy;\n"
6503     "TEX R0, R0.zwzw, texture[0], 2D;\n"
6504     "ADD R1.x, -R1, c[5];\n"
6505     "MUL R1, fragment.color.primary, R1.x;\n"
6506     "ADD R2.x, -R0.w, c[5];\n"
6507     "MUL R2.xyz, R1, R2.x;\n"
6508     "MAD R1.xyz, R1, R0, R2;\n"
6509     "ADD R2.x, R1.w, R0.w;\n"
6510     "ADD R2.y, -R1.w, c[5].x;\n"
6511     "MAD result.color.xyz, R0, R2.y, R1;\n"
6512     "MAD result.color.w, -R1, R0, R2.x;\n"
6513     "END\n"
6514     ;
6515 
6516 static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_PATTERN_COMPOSITION_MODES_SCREEN_NOMASK =
6517     "!!ARBfp1.0\n"
6518     "PARAM c[6] = { program.local[0..4],\n"
6519     "		{ 1 } };\n"
6520     "TEMP R0;\n"
6521     "TEMP R1;\n"
6522     "TEMP R2;\n"
6523     "MUL R0.xyz, fragment.position.y, c[2];\n"
6524     "MAD R0.xyz, fragment.position.x, c[1], R0;\n"
6525     "ADD R0.xyz, R0, c[3];\n"
6526     "RCP R0.z, R0.z;\n"
6527     "MUL R0.xy, R0, R0.z;\n"
6528     "MUL R0.xy, R0, c[0];\n"
6529     "TEX R0.x, R0, texture[1], 2D;\n"
6530     "ADD R1.x, -R0, c[5];\n"
6531     "MUL R0.zw, fragment.position.xyxy, c[4].xyxy;\n"
6532     "TEX R0, R0.zwzw, texture[0], 2D;\n"
6533     "MUL R1, fragment.color.primary, R1.x;\n"
6534     "ADD R2, R1, R0;\n"
6535     "MAD result.color, -R1, R0, R2;\n"
6536     "END\n"
6537     ;
6538 
6539 static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_PATTERN_COMPOSITION_MODES_OVERLAY_NOMASK =
6540     "!!ARBfp1.0\n"
6541     "PARAM c[6] = { program.local[0..4],\n"
6542     "		{ 1, 2 } };\n"
6543     "TEMP R0;\n"
6544     "TEMP R1;\n"
6545     "TEMP R2;\n"
6546     "TEMP R3;\n"
6547     "MUL R0.xyz, fragment.position.y, c[2];\n"
6548     "MAD R0.xyz, fragment.position.x, c[1], R0;\n"
6549     "ADD R0.xyz, R0, c[3];\n"
6550     "RCP R0.z, R0.z;\n"
6551     "MUL R0.xy, R0, R0.z;\n"
6552     "MUL R0.xy, R0, c[0];\n"
6553     "TEX R0.x, R0, texture[1], 2D;\n"
6554     "ADD R0.x, -R0, c[5];\n"
6555     "MUL R1, fragment.color.primary, R0.x;\n"
6556     "MUL R0.zw, fragment.position.xyxy, c[4].xyxy;\n"
6557     "TEX R0, R0.zwzw, texture[0], 2D;\n"
6558     "ADD R3.xyz, R1.w, -R1;\n"
6559     "ADD R2.xyz, R0.w, -R0;\n"
6560     "MUL R2.xyz, R2, R3;\n"
6561     "ADD R2.w, -R0, c[5].x;\n"
6562     "MUL R2.xyz, R2, c[5].y;\n"
6563     "MAD R2.xyz, R1.w, R0.w, -R2;\n"
6564     "MAD R2.xyz, R1, R2.w, R2;\n"
6565     "MUL R3.xyz, R1, R2.w;\n"
6566     "MUL R1.xyz, R1, R0;\n"
6567     "ADD R2.w, -R1, c[5].x;\n"
6568     "MAD R1.xyz, R1, c[5].y, R3;\n"
6569     "MAD R1.xyz, R0, R2.w, R1;\n"
6570     "MAD R2.xyz, R0, R2.w, R2;\n"
6571     "MUL R0.xyz, R0, c[5].y;\n"
6572     "ADD R2.w, R1, R0;\n"
6573     "ADD R2.xyz, R2, -R1;\n"
6574     "SGE R0.xyz, R0, R0.w;\n"
6575     "MAD result.color.xyz, R0, R2, R1;\n"
6576     "MAD result.color.w, -R1, R0, R2;\n"
6577     "END\n"
6578     ;
6579 
6580 static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_PATTERN_COMPOSITION_MODES_DARKEN_NOMASK =
6581     "!!ARBfp1.0\n"
6582     "PARAM c[6] = { program.local[0..4],\n"
6583     "		{ 1 } };\n"
6584     "TEMP R0;\n"
6585     "TEMP R1;\n"
6586     "TEMP R2;\n"
6587     "TEMP R3;\n"
6588     "MUL R0.xyz, fragment.position.y, c[2];\n"
6589     "MAD R0.xyz, fragment.position.x, c[1], R0;\n"
6590     "ADD R0.xyz, R0, c[3];\n"
6591     "RCP R0.z, R0.z;\n"
6592     "MUL R0.xy, R0, R0.z;\n"
6593     "MUL R0.xy, R0, c[0];\n"
6594     "TEX R0.x, R0, texture[1], 2D;\n"
6595     "ADD R1.x, -R0, c[5];\n"
6596     "MUL R0.zw, fragment.position.xyxy, c[4].xyxy;\n"
6597     "TEX R0, R0.zwzw, texture[0], 2D;\n"
6598     "MUL R1, fragment.color.primary, R1.x;\n"
6599     "MUL R2.xyz, R1, R0.w;\n"
6600     "MUL R3.xyz, R1.w, R0;\n"
6601     "MIN R2.xyz, R2, R3;\n"
6602     "ADD R2.w, -R0, c[5].x;\n"
6603     "MAD R1.xyz, R1, R2.w, R2;\n"
6604     "ADD R2.x, R1.w, R0.w;\n"
6605     "ADD R2.y, -R1.w, c[5].x;\n"
6606     "MAD result.color.xyz, R0, R2.y, R1;\n"
6607     "MAD result.color.w, -R1, R0, R2.x;\n"
6608     "END\n"
6609     ;
6610 
6611 static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_PATTERN_COMPOSITION_MODES_LIGHTEN_NOMASK =
6612     "!!ARBfp1.0\n"
6613     "PARAM c[6] = { program.local[0..4],\n"
6614     "		{ 1 } };\n"
6615     "TEMP R0;\n"
6616     "TEMP R1;\n"
6617     "TEMP R2;\n"
6618     "TEMP R3;\n"
6619     "MUL R0.xyz, fragment.position.y, c[2];\n"
6620     "MAD R0.xyz, fragment.position.x, c[1], R0;\n"
6621     "ADD R0.xyz, R0, c[3];\n"
6622     "RCP R0.z, R0.z;\n"
6623     "MUL R0.xy, R0, R0.z;\n"
6624     "MUL R0.xy, R0, c[0];\n"
6625     "TEX R0.x, R0, texture[1], 2D;\n"
6626     "ADD R1.x, -R0, c[5];\n"
6627     "MUL R0.zw, fragment.position.xyxy, c[4].xyxy;\n"
6628     "TEX R0, R0.zwzw, texture[0], 2D;\n"
6629     "MUL R1, fragment.color.primary, R1.x;\n"
6630     "MUL R2.xyz, R1, R0.w;\n"
6631     "MUL R3.xyz, R1.w, R0;\n"
6632     "MAX R2.xyz, R2, R3;\n"
6633     "ADD R2.w, -R0, c[5].x;\n"
6634     "MAD R1.xyz, R1, R2.w, R2;\n"
6635     "ADD R2.x, R1.w, R0.w;\n"
6636     "ADD R2.y, -R1.w, c[5].x;\n"
6637     "MAD result.color.xyz, R0, R2.y, R1;\n"
6638     "MAD result.color.w, -R1, R0, R2.x;\n"
6639     "END\n"
6640     ;
6641 
6642 static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_PATTERN_COMPOSITION_MODES_COLORDODGE_NOMASK =
6643     "!!ARBfp1.0\n"
6644     "PARAM c[6] = { program.local[0..4],\n"
6645     "		{ 1, 1e-006 } };\n"
6646     "TEMP R0;\n"
6647     "TEMP R1;\n"
6648     "TEMP R2;\n"
6649     "TEMP R3;\n"
6650     "MUL R0.xyz, fragment.position.y, c[2];\n"
6651     "MAD R0.xyz, fragment.position.x, c[1], R0;\n"
6652     "ADD R0.xyz, R0, c[3];\n"
6653     "RCP R0.z, R0.z;\n"
6654     "MUL R0.xy, R0, R0.z;\n"
6655     "MUL R0.xy, R0, c[0];\n"
6656     "TEX R0.x, R0, texture[1], 2D;\n"
6657     "ADD R0.x, -R0, c[5];\n"
6658     "MUL R1, fragment.color.primary, R0.x;\n"
6659     "MAX R0.x, R1.w, c[5].y;\n"
6660     "RCP R0.x, R0.x;\n"
6661     "MAD R3.xyz, -R1, R0.x, c[5].x;\n"
6662     "MAX R3.xyz, R3, c[5].y;\n"
6663     "MUL R0.xy, fragment.position, c[4];\n"
6664     "TEX R0, R0, texture[0], 2D;\n"
6665     "ADD R2.x, -R1.w, c[5];\n"
6666     "MUL R2.xyz, R0, R2.x;\n"
6667     "ADD R2.w, -R0, c[5].x;\n"
6668     "MAD R2.xyz, R1, R2.w, R2;\n"
6669     "MUL R0.xyz, R1.w, R0;\n"
6670     "RCP R3.x, R3.x;\n"
6671     "RCP R3.y, R3.y;\n"
6672     "RCP R3.z, R3.z;\n"
6673     "MAD R3.xyz, R0, R3, R2;\n"
6674     "MAD R0.xyz, R1, R0.w, R0;\n"
6675     "MAD R2.xyz, R1.w, R0.w, R2;\n"
6676     "MUL R2.w, R1, R0;\n"
6677     "ADD R1.x, R1.w, R0.w;\n"
6678     "ADD R2.xyz, R2, -R3;\n"
6679     "SGE R0.xyz, R0, R2.w;\n"
6680     "MAD result.color.xyz, R0, R2, R3;\n"
6681     "MAD result.color.w, -R1, R0, R1.x;\n"
6682     "END\n"
6683     ;
6684 
6685 static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_PATTERN_COMPOSITION_MODES_COLORBURN_NOMASK =
6686     "!!ARBfp1.0\n"
6687     "PARAM c[6] = { program.local[0..4],\n"
6688     "		{ 1, 9.9999997e-006 } };\n"
6689     "TEMP R0;\n"
6690     "TEMP R1;\n"
6691     "TEMP R2;\n"
6692     "TEMP R3;\n"
6693     "TEMP R4;\n"
6694     "TEMP R5;\n"
6695     "MUL R0.xyz, fragment.position.y, c[2];\n"
6696     "MAD R0.xyz, fragment.position.x, c[1], R0;\n"
6697     "ADD R0.xyz, R0, c[3];\n"
6698     "RCP R0.z, R0.z;\n"
6699     "MUL R0.xy, R0, R0.z;\n"
6700     "MUL R0.xy, R0, c[0];\n"
6701     "TEX R0.x, R0, texture[1], 2D;\n"
6702     "ADD R1.x, -R0, c[5];\n"
6703     "MUL R1, fragment.color.primary, R1.x;\n"
6704     "MUL R0.zw, fragment.position.xyxy, c[4].xyxy;\n"
6705     "TEX R0, R0.zwzw, texture[0], 2D;\n"
6706     "MUL R2.xyz, R1.w, R0;\n"
6707     "MAD R3.xyz, R1, R0.w, R2;\n"
6708     "ADD R2.w, -R0, c[5].x;\n"
6709     "MAD R2.xyz, -R1.w, R0.w, R3;\n"
6710     "MUL R4.xyz, R1.w, R2;\n"
6711     "MAX R2.xyz, R1, c[5].y;\n"
6712     "MUL R5.xyz, R1, R2.w;\n"
6713     "ADD R3.w, -R1, c[5].x;\n"
6714     "RCP R2.x, R2.x;\n"
6715     "RCP R2.y, R2.y;\n"
6716     "RCP R2.z, R2.z;\n"
6717     "MAD R2.xyz, R4, R2, R5;\n"
6718     "MUL R4.xyz, R0, R3.w;\n"
6719     "MAD R0.xyz, R0, R3.w, R2;\n"
6720     "MAD R1.xyz, R1, R2.w, R4;\n"
6721     "MUL R2.x, R1.w, R0.w;\n"
6722     "ADD R2.w, R1, R0;\n"
6723     "ADD R0.xyz, R0, -R1;\n"
6724     "SGE R2.xyz, R3, R2.x;\n"
6725     "MAD result.color.xyz, R2, R0, R1;\n"
6726     "MAD result.color.w, -R1, R0, R2;\n"
6727     "END\n"
6728     ;
6729 
6730 static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_PATTERN_COMPOSITION_MODES_HARDLIGHT_NOMASK =
6731     "!!ARBfp1.0\n"
6732     "PARAM c[6] = { program.local[0..4],\n"
6733     "		{ 1, 2 } };\n"
6734     "TEMP R0;\n"
6735     "TEMP R1;\n"
6736     "TEMP R2;\n"
6737     "TEMP R3;\n"
6738     "TEMP R4;\n"
6739     "MUL R0.xyz, fragment.position.y, c[2];\n"
6740     "MAD R0.xyz, fragment.position.x, c[1], R0;\n"
6741     "ADD R0.xyz, R0, c[3];\n"
6742     "RCP R0.z, R0.z;\n"
6743     "MUL R0.xy, R0, R0.z;\n"
6744     "MUL R0.xy, R0, c[0];\n"
6745     "TEX R0.x, R0, texture[1], 2D;\n"
6746     "ADD R0.x, -R0, c[5];\n"
6747     "MUL R1, fragment.color.primary, R0.x;\n"
6748     "MUL R0.zw, fragment.position.xyxy, c[4].xyxy;\n"
6749     "TEX R0, R0.zwzw, texture[0], 2D;\n"
6750     "ADD R2.w, -R0, c[5].x;\n"
6751     "ADD R3.xyz, R1.w, -R1;\n"
6752     "ADD R2.xyz, R0.w, -R0;\n"
6753     "MUL R2.xyz, R2, R3;\n"
6754     "MUL R2.xyz, R2, c[5].y;\n"
6755     "MAD R2.xyz, R1.w, R0.w, -R2;\n"
6756     "MAD R2.xyz, R1, R2.w, R2;\n"
6757     "MUL R4.xyz, R1, R2.w;\n"
6758     "MUL R3.xyz, R1, R0;\n"
6759     "MUL R1.xyz, R1, c[5].y;\n"
6760     "ADD R2.w, -R1, c[5].x;\n"
6761     "MAD R3.xyz, R3, c[5].y, R4;\n"
6762     "MAD R3.xyz, R0, R2.w, R3;\n"
6763     "MAD R0.xyz, R0, R2.w, R2;\n"
6764     "ADD R2.x, R1.w, R0.w;\n"
6765     "ADD R0.xyz, R0, -R3;\n"
6766     "SGE R1.xyz, R1, R1.w;\n"
6767     "MAD result.color.xyz, R1, R0, R3;\n"
6768     "MAD result.color.w, -R1, R0, R2.x;\n"
6769     "END\n"
6770     ;
6771 
6772 static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_PATTERN_COMPOSITION_MODES_SOFTLIGHT_NOMASK =
6773     "!!ARBfp1.0\n"
6774     "PARAM c[7] = { program.local[0..4],\n"
6775     "		{ 1, 2, 9.9999997e-006, 4 },\n"
6776     "		{ 16, 12, 3 } };\n"
6777     "TEMP R0;\n"
6778     "TEMP R1;\n"
6779     "TEMP R2;\n"
6780     "TEMP R3;\n"
6781     "TEMP R4;\n"
6782     "TEMP R5;\n"
6783     "TEMP R6;\n"
6784     "MUL R0.xyz, fragment.position.y, c[2];\n"
6785     "MAD R0.xyz, fragment.position.x, c[1], R0;\n"
6786     "ADD R1.xyz, R0, c[3];\n"
6787     "RCP R1.z, R1.z;\n"
6788     "MUL R1.xy, R1, R1.z;\n"
6789     "MUL R1.xy, R1, c[0];\n"
6790     "TEX R1.x, R1, texture[1], 2D;\n"
6791     "MUL R0.xy, fragment.position, c[4];\n"
6792     "TEX R0, R0, texture[0], 2D;\n"
6793     "MAX R1.z, R0.w, c[5];\n"
6794     "RCP R1.z, R1.z;\n"
6795     "MUL R3.xyz, R0, R1.z;\n"
6796     "MAD R2.xyz, R3, c[6].x, -c[6].y;\n"
6797     "ADD R1.x, -R1, c[5];\n"
6798     "MUL R1, fragment.color.primary, R1.x;\n"
6799     "MAD R4.xyz, R3, R2, c[6].z;\n"
6800     "MAD R2.xyz, R1, c[5].y, -R1.w;\n"
6801     "MUL R5.xyz, R0.w, R2;\n"
6802     "MUL R6.xyz, R5, R4;\n"
6803     "RSQ R2.w, R3.x;\n"
6804     "RCP R4.x, R2.w;\n"
6805     "RSQ R2.w, R3.y;\n"
6806     "RSQ R3.w, R3.z;\n"
6807     "RCP R4.y, R2.w;\n"
6808     "RCP R4.z, R3.w;\n"
6809     "ADD R4.xyz, -R3, R4;\n"
6810     "MUL R6.xyz, R3, R6;\n"
6811     "MUL R4.xyz, R5, R4;\n"
6812     "ADD R3.xyz, -R3, c[5].x;\n"
6813     "MAD R2.xyz, R2, R3, R1.w;\n"
6814     "MUL R3.xyz, R1, c[5].y;\n"
6815     "MAD R5.xyz, R1.w, R0, R6;\n"
6816     "MAD R4.xyz, R1.w, R0, R4;\n"
6817     "ADD R6.xyz, R4, -R5;\n"
6818     "MUL R4.xyz, R0, c[5].w;\n"
6819     "SGE R4.xyz, R4, R0.w;\n"
6820     "MAD R4.xyz, R4, R6, R5;\n"
6821     "MAD R4.xyz, -R0, R2, R4;\n"
6822     "MUL R2.xyz, R0, R2;\n"
6823     "SGE R3.xyz, R3, R1.w;\n"
6824     "MAD R2.xyz, R3, R4, R2;\n"
6825     "ADD R2.w, -R0, c[5].x;\n"
6826     "MAD R2.xyz, R1, R2.w, R2;\n"
6827     "ADD R1.x, R1.w, R0.w;\n"
6828     "ADD R1.y, -R1.w, c[5].x;\n"
6829     "MAD result.color.xyz, R0, R1.y, R2;\n"
6830     "MAD result.color.w, -R1, R0, R1.x;\n"
6831     "END\n"
6832     ;
6833 
6834 static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_PATTERN_COMPOSITION_MODES_DIFFERENCE_NOMASK =
6835     "!!ARBfp1.0\n"
6836     "PARAM c[6] = { program.local[0..4],\n"
6837     "		{ 1, 2 } };\n"
6838     "TEMP R0;\n"
6839     "TEMP R1;\n"
6840     "TEMP R2;\n"
6841     "TEMP R3;\n"
6842     "MUL R0.xyz, fragment.position.y, c[2];\n"
6843     "MAD R0.xyz, fragment.position.x, c[1], R0;\n"
6844     "ADD R0.xyz, R0, c[3];\n"
6845     "RCP R0.z, R0.z;\n"
6846     "MUL R0.xy, R0, R0.z;\n"
6847     "MUL R0.xy, R0, c[0];\n"
6848     "TEX R0.x, R0, texture[1], 2D;\n"
6849     "ADD R1.x, -R0, c[5];\n"
6850     "MUL R0.zw, fragment.position.xyxy, c[4].xyxy;\n"
6851     "TEX R0, R0.zwzw, texture[0], 2D;\n"
6852     "MUL R1, fragment.color.primary, R1.x;\n"
6853     "MUL R3.xyz, R1.w, R0;\n"
6854     "MUL R2.xyz, R1, R0.w;\n"
6855     "ADD R0.xyz, R1, R0;\n"
6856     "MIN R2.xyz, R2, R3;\n"
6857     "ADD R1.x, R1.w, R0.w;\n"
6858     "MAD result.color.xyz, -R2, c[5].y, R0;\n"
6859     "MAD result.color.w, -R1, R0, R1.x;\n"
6860     "END\n"
6861     ;
6862 
6863 static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_PATTERN_COMPOSITION_MODES_EXCLUSION_NOMASK =
6864     "!!ARBfp1.0\n"
6865     "PARAM c[6] = { program.local[0..4],\n"
6866     "		{ 1, 2 } };\n"
6867     "TEMP R0;\n"
6868     "TEMP R1;\n"
6869     "TEMP R2;\n"
6870     "TEMP R3;\n"
6871     "MUL R0.xyz, fragment.position.y, c[2];\n"
6872     "MAD R0.xyz, fragment.position.x, c[1], R0;\n"
6873     "ADD R0.xyz, R0, c[3];\n"
6874     "RCP R0.z, R0.z;\n"
6875     "MUL R0.xy, R0, R0.z;\n"
6876     "MUL R0.xy, R0, c[0];\n"
6877     "TEX R0.x, R0, texture[1], 2D;\n"
6878     "ADD R1.x, -R0, c[5];\n"
6879     "MUL R0.zw, fragment.position.xyxy, c[4].xyxy;\n"
6880     "TEX R0, R0.zwzw, texture[0], 2D;\n"
6881     "MUL R1, fragment.color.primary, R1.x;\n"
6882     "MUL R2.xyz, R1.w, R0;\n"
6883     "MAD R3.xyz, R1, R0.w, R2;\n"
6884     "MUL R2.xyz, R1, R0;\n"
6885     "MAD R2.xyz, -R2, c[5].y, R3;\n"
6886     "ADD R2.w, -R0, c[5].x;\n"
6887     "MAD R1.xyz, R1, R2.w, R2;\n"
6888     "ADD R2.x, R1.w, R0.w;\n"
6889     "ADD R2.y, -R1.w, c[5].x;\n"
6890     "MAD result.color.xyz, R0, R2.y, R1;\n"
6891     "MAD result.color.w, -R1, R0, R2.x;\n"
6892     "END\n"
6893     ;
6894 
6895 static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_PATTERN_COMPOSITION_MODE_BLEND_MODE_MASK =
6896     "!!ARBfp1.0\n"
6897     "PARAM c[8] = { program.local[0..6],\n"
6898     "		{ 1 } };\n"
6899     "TEMP R0;\n"
6900     "TEMP R1;\n"
6901     "MUL R0.xyz, fragment.position.y, c[2];\n"
6902     "MAD R0.xyz, fragment.position.x, c[1], R0;\n"
6903     "ADD R0.xyz, R0, c[3];\n"
6904     "RCP R0.z, R0.z;\n"
6905     "MUL R0.zw, R0.xyxy, R0.z;\n"
6906     "MUL R0.zw, R0, c[0].xyxy;\n"
6907     "TEX R1.x, R0.zwzw, texture[1], 2D;\n"
6908     "ADD R0.xy, fragment.position, c[5];\n"
6909     "MUL R0.xy, R0, c[4];\n"
6910     "TEX R0, R0, texture[0], 2D;\n"
6911     "DP4 R1.y, R0, c[6];\n"
6912     "ADD R1.x, -R1, c[7];\n"
6913     "MUL R0, fragment.color.primary, R1.x;\n"
6914     "MUL result.color, R0, R1.y;\n"
6915     "END\n"
6916     ;
6917 
6918 static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_PATTERN_COMPOSITION_MODE_BLEND_MODE_NOMASK =
6919     "!!ARBfp1.0\n"
6920     "PARAM c[5] = { program.local[0..3],\n"
6921     "		{ 1 } };\n"
6922     "TEMP R0;\n"
6923     "MUL R0.xyz, fragment.position.y, c[2];\n"
6924     "MAD R0.xyz, fragment.position.x, c[1], R0;\n"
6925     "ADD R0.xyz, R0, c[3];\n"
6926     "RCP R0.z, R0.z;\n"
6927     "MUL R0.xy, R0, R0.z;\n"
6928     "MUL R0.xy, R0, c[0];\n"
6929     "TEX R0.x, R0, texture[0], 2D;\n"
6930     "ADD R0.x, -R0, c[4];\n"
6931     "MUL result.color, fragment.color.primary, R0.x;\n"
6932     "END\n"
6933     ;
6934 
6935 static const char *mask_fragment_program_sources[num_fragment_masks] = {
6936     FragmentProgram_FRAGMENT_PROGRAM_MASK_TRAPEZOID_AA,
6937     FragmentProgram_FRAGMENT_PROGRAM_MASK_ELLIPSE_AA,
6938 };
6939 
6940 static const char *painter_fragment_program_sources[num_fragment_brushes][num_fragment_composition_modes] = {
6941     {
6942         FragmentProgram_FRAGMENT_PROGRAM_BRUSH_SOLID_COMPOSITION_MODES_SIMPLE_PORTER_DUFF,
6943         FragmentProgram_FRAGMENT_PROGRAM_BRUSH_SOLID_COMPOSITION_MODES_MULTIPLY,
6944         FragmentProgram_FRAGMENT_PROGRAM_BRUSH_SOLID_COMPOSITION_MODES_SCREEN,
6945         FragmentProgram_FRAGMENT_PROGRAM_BRUSH_SOLID_COMPOSITION_MODES_OVERLAY,
6946         FragmentProgram_FRAGMENT_PROGRAM_BRUSH_SOLID_COMPOSITION_MODES_DARKEN,
6947         FragmentProgram_FRAGMENT_PROGRAM_BRUSH_SOLID_COMPOSITION_MODES_LIGHTEN,
6948         FragmentProgram_FRAGMENT_PROGRAM_BRUSH_SOLID_COMPOSITION_MODES_COLORDODGE,
6949         FragmentProgram_FRAGMENT_PROGRAM_BRUSH_SOLID_COMPOSITION_MODES_COLORBURN,
6950         FragmentProgram_FRAGMENT_PROGRAM_BRUSH_SOLID_COMPOSITION_MODES_HARDLIGHT,
6951         FragmentProgram_FRAGMENT_PROGRAM_BRUSH_SOLID_COMPOSITION_MODES_SOFTLIGHT,
6952         FragmentProgram_FRAGMENT_PROGRAM_BRUSH_SOLID_COMPOSITION_MODES_DIFFERENCE,
6953         FragmentProgram_FRAGMENT_PROGRAM_BRUSH_SOLID_COMPOSITION_MODES_EXCLUSION,
6954         FragmentProgram_FRAGMENT_PROGRAM_BRUSH_SOLID_COMPOSITION_MODES_SIMPLE_PORTER_DUFF_NOMASK,
6955         FragmentProgram_FRAGMENT_PROGRAM_BRUSH_SOLID_COMPOSITION_MODES_MULTIPLY_NOMASK,
6956         FragmentProgram_FRAGMENT_PROGRAM_BRUSH_SOLID_COMPOSITION_MODES_SCREEN_NOMASK,
6957         FragmentProgram_FRAGMENT_PROGRAM_BRUSH_SOLID_COMPOSITION_MODES_OVERLAY_NOMASK,
6958         FragmentProgram_FRAGMENT_PROGRAM_BRUSH_SOLID_COMPOSITION_MODES_DARKEN_NOMASK,
6959         FragmentProgram_FRAGMENT_PROGRAM_BRUSH_SOLID_COMPOSITION_MODES_LIGHTEN_NOMASK,
6960         FragmentProgram_FRAGMENT_PROGRAM_BRUSH_SOLID_COMPOSITION_MODES_COLORDODGE_NOMASK,
6961         FragmentProgram_FRAGMENT_PROGRAM_BRUSH_SOLID_COMPOSITION_MODES_COLORBURN_NOMASK,
6962         FragmentProgram_FRAGMENT_PROGRAM_BRUSH_SOLID_COMPOSITION_MODES_HARDLIGHT_NOMASK,
6963         FragmentProgram_FRAGMENT_PROGRAM_BRUSH_SOLID_COMPOSITION_MODES_SOFTLIGHT_NOMASK,
6964         FragmentProgram_FRAGMENT_PROGRAM_BRUSH_SOLID_COMPOSITION_MODES_DIFFERENCE_NOMASK,
6965         FragmentProgram_FRAGMENT_PROGRAM_BRUSH_SOLID_COMPOSITION_MODES_EXCLUSION_NOMASK,
6966         FragmentProgram_FRAGMENT_PROGRAM_BRUSH_SOLID_COMPOSITION_MODE_BLEND_MODE_MASK,
6967         FragmentProgram_FRAGMENT_PROGRAM_BRUSH_SOLID_COMPOSITION_MODE_BLEND_MODE_NOMASK,
6968     },
6969     {
6970         FragmentProgram_FRAGMENT_PROGRAM_BRUSH_RADIAL_COMPOSITION_MODES_SIMPLE_PORTER_DUFF,
6971         FragmentProgram_FRAGMENT_PROGRAM_BRUSH_RADIAL_COMPOSITION_MODES_MULTIPLY,
6972         FragmentProgram_FRAGMENT_PROGRAM_BRUSH_RADIAL_COMPOSITION_MODES_SCREEN,
6973         FragmentProgram_FRAGMENT_PROGRAM_BRUSH_RADIAL_COMPOSITION_MODES_OVERLAY,
6974         FragmentProgram_FRAGMENT_PROGRAM_BRUSH_RADIAL_COMPOSITION_MODES_DARKEN,
6975         FragmentProgram_FRAGMENT_PROGRAM_BRUSH_RADIAL_COMPOSITION_MODES_LIGHTEN,
6976         FragmentProgram_FRAGMENT_PROGRAM_BRUSH_RADIAL_COMPOSITION_MODES_COLORDODGE,
6977         FragmentProgram_FRAGMENT_PROGRAM_BRUSH_RADIAL_COMPOSITION_MODES_COLORBURN,
6978         FragmentProgram_FRAGMENT_PROGRAM_BRUSH_RADIAL_COMPOSITION_MODES_HARDLIGHT,
6979         FragmentProgram_FRAGMENT_PROGRAM_BRUSH_RADIAL_COMPOSITION_MODES_SOFTLIGHT,
6980         FragmentProgram_FRAGMENT_PROGRAM_BRUSH_RADIAL_COMPOSITION_MODES_DIFFERENCE,
6981         FragmentProgram_FRAGMENT_PROGRAM_BRUSH_RADIAL_COMPOSITION_MODES_EXCLUSION,
6982         FragmentProgram_FRAGMENT_PROGRAM_BRUSH_RADIAL_COMPOSITION_MODES_SIMPLE_PORTER_DUFF_NOMASK,
6983         FragmentProgram_FRAGMENT_PROGRAM_BRUSH_RADIAL_COMPOSITION_MODES_MULTIPLY_NOMASK,
6984         FragmentProgram_FRAGMENT_PROGRAM_BRUSH_RADIAL_COMPOSITION_MODES_SCREEN_NOMASK,
6985         FragmentProgram_FRAGMENT_PROGRAM_BRUSH_RADIAL_COMPOSITION_MODES_OVERLAY_NOMASK,
6986         FragmentProgram_FRAGMENT_PROGRAM_BRUSH_RADIAL_COMPOSITION_MODES_DARKEN_NOMASK,
6987         FragmentProgram_FRAGMENT_PROGRAM_BRUSH_RADIAL_COMPOSITION_MODES_LIGHTEN_NOMASK,
6988         FragmentProgram_FRAGMENT_PROGRAM_BRUSH_RADIAL_COMPOSITION_MODES_COLORDODGE_NOMASK,
6989         FragmentProgram_FRAGMENT_PROGRAM_BRUSH_RADIAL_COMPOSITION_MODES_COLORBURN_NOMASK,
6990         FragmentProgram_FRAGMENT_PROGRAM_BRUSH_RADIAL_COMPOSITION_MODES_HARDLIGHT_NOMASK,
6991         FragmentProgram_FRAGMENT_PROGRAM_BRUSH_RADIAL_COMPOSITION_MODES_SOFTLIGHT_NOMASK,
6992         FragmentProgram_FRAGMENT_PROGRAM_BRUSH_RADIAL_COMPOSITION_MODES_DIFFERENCE_NOMASK,
6993         FragmentProgram_FRAGMENT_PROGRAM_BRUSH_RADIAL_COMPOSITION_MODES_EXCLUSION_NOMASK,
6994         FragmentProgram_FRAGMENT_PROGRAM_BRUSH_RADIAL_COMPOSITION_MODE_BLEND_MODE_MASK,
6995         FragmentProgram_FRAGMENT_PROGRAM_BRUSH_RADIAL_COMPOSITION_MODE_BLEND_MODE_NOMASK,
6996     },
6997     {
6998         FragmentProgram_FRAGMENT_PROGRAM_BRUSH_CONICAL_COMPOSITION_MODES_SIMPLE_PORTER_DUFF,
6999         FragmentProgram_FRAGMENT_PROGRAM_BRUSH_CONICAL_COMPOSITION_MODES_MULTIPLY,
7000         FragmentProgram_FRAGMENT_PROGRAM_BRUSH_CONICAL_COMPOSITION_MODES_SCREEN,
7001         FragmentProgram_FRAGMENT_PROGRAM_BRUSH_CONICAL_COMPOSITION_MODES_OVERLAY,
7002         FragmentProgram_FRAGMENT_PROGRAM_BRUSH_CONICAL_COMPOSITION_MODES_DARKEN,
7003         FragmentProgram_FRAGMENT_PROGRAM_BRUSH_CONICAL_COMPOSITION_MODES_LIGHTEN,
7004         FragmentProgram_FRAGMENT_PROGRAM_BRUSH_CONICAL_COMPOSITION_MODES_COLORDODGE,
7005         FragmentProgram_FRAGMENT_PROGRAM_BRUSH_CONICAL_COMPOSITION_MODES_COLORBURN,
7006         FragmentProgram_FRAGMENT_PROGRAM_BRUSH_CONICAL_COMPOSITION_MODES_HARDLIGHT,
7007         FragmentProgram_FRAGMENT_PROGRAM_BRUSH_CONICAL_COMPOSITION_MODES_SOFTLIGHT,
7008         FragmentProgram_FRAGMENT_PROGRAM_BRUSH_CONICAL_COMPOSITION_MODES_DIFFERENCE,
7009         FragmentProgram_FRAGMENT_PROGRAM_BRUSH_CONICAL_COMPOSITION_MODES_EXCLUSION,
7010         FragmentProgram_FRAGMENT_PROGRAM_BRUSH_CONICAL_COMPOSITION_MODES_SIMPLE_PORTER_DUFF_NOMASK,
7011         FragmentProgram_FRAGMENT_PROGRAM_BRUSH_CONICAL_COMPOSITION_MODES_MULTIPLY_NOMASK,
7012         FragmentProgram_FRAGMENT_PROGRAM_BRUSH_CONICAL_COMPOSITION_MODES_SCREEN_NOMASK,
7013         FragmentProgram_FRAGMENT_PROGRAM_BRUSH_CONICAL_COMPOSITION_MODES_OVERLAY_NOMASK,
7014         FragmentProgram_FRAGMENT_PROGRAM_BRUSH_CONICAL_COMPOSITION_MODES_DARKEN_NOMASK,
7015         FragmentProgram_FRAGMENT_PROGRAM_BRUSH_CONICAL_COMPOSITION_MODES_LIGHTEN_NOMASK,
7016         FragmentProgram_FRAGMENT_PROGRAM_BRUSH_CONICAL_COMPOSITION_MODES_COLORDODGE_NOMASK,
7017         FragmentProgram_FRAGMENT_PROGRAM_BRUSH_CONICAL_COMPOSITION_MODES_COLORBURN_NOMASK,
7018         FragmentProgram_FRAGMENT_PROGRAM_BRUSH_CONICAL_COMPOSITION_MODES_HARDLIGHT_NOMASK,
7019         FragmentProgram_FRAGMENT_PROGRAM_BRUSH_CONICAL_COMPOSITION_MODES_SOFTLIGHT_NOMASK,
7020         FragmentProgram_FRAGMENT_PROGRAM_BRUSH_CONICAL_COMPOSITION_MODES_DIFFERENCE_NOMASK,
7021         FragmentProgram_FRAGMENT_PROGRAM_BRUSH_CONICAL_COMPOSITION_MODES_EXCLUSION_NOMASK,
7022         FragmentProgram_FRAGMENT_PROGRAM_BRUSH_CONICAL_COMPOSITION_MODE_BLEND_MODE_MASK,
7023         FragmentProgram_FRAGMENT_PROGRAM_BRUSH_CONICAL_COMPOSITION_MODE_BLEND_MODE_NOMASK,
7024     },
7025     {
7026         FragmentProgram_FRAGMENT_PROGRAM_BRUSH_LINEAR_COMPOSITION_MODES_SIMPLE_PORTER_DUFF,
7027         FragmentProgram_FRAGMENT_PROGRAM_BRUSH_LINEAR_COMPOSITION_MODES_MULTIPLY,
7028         FragmentProgram_FRAGMENT_PROGRAM_BRUSH_LINEAR_COMPOSITION_MODES_SCREEN,
7029         FragmentProgram_FRAGMENT_PROGRAM_BRUSH_LINEAR_COMPOSITION_MODES_OVERLAY,
7030         FragmentProgram_FRAGMENT_PROGRAM_BRUSH_LINEAR_COMPOSITION_MODES_DARKEN,
7031         FragmentProgram_FRAGMENT_PROGRAM_BRUSH_LINEAR_COMPOSITION_MODES_LIGHTEN,
7032         FragmentProgram_FRAGMENT_PROGRAM_BRUSH_LINEAR_COMPOSITION_MODES_COLORDODGE,
7033         FragmentProgram_FRAGMENT_PROGRAM_BRUSH_LINEAR_COMPOSITION_MODES_COLORBURN,
7034         FragmentProgram_FRAGMENT_PROGRAM_BRUSH_LINEAR_COMPOSITION_MODES_HARDLIGHT,
7035         FragmentProgram_FRAGMENT_PROGRAM_BRUSH_LINEAR_COMPOSITION_MODES_SOFTLIGHT,
7036         FragmentProgram_FRAGMENT_PROGRAM_BRUSH_LINEAR_COMPOSITION_MODES_DIFFERENCE,
7037         FragmentProgram_FRAGMENT_PROGRAM_BRUSH_LINEAR_COMPOSITION_MODES_EXCLUSION,
7038         FragmentProgram_FRAGMENT_PROGRAM_BRUSH_LINEAR_COMPOSITION_MODES_SIMPLE_PORTER_DUFF_NOMASK,
7039         FragmentProgram_FRAGMENT_PROGRAM_BRUSH_LINEAR_COMPOSITION_MODES_MULTIPLY_NOMASK,
7040         FragmentProgram_FRAGMENT_PROGRAM_BRUSH_LINEAR_COMPOSITION_MODES_SCREEN_NOMASK,
7041         FragmentProgram_FRAGMENT_PROGRAM_BRUSH_LINEAR_COMPOSITION_MODES_OVERLAY_NOMASK,
7042         FragmentProgram_FRAGMENT_PROGRAM_BRUSH_LINEAR_COMPOSITION_MODES_DARKEN_NOMASK,
7043         FragmentProgram_FRAGMENT_PROGRAM_BRUSH_LINEAR_COMPOSITION_MODES_LIGHTEN_NOMASK,
7044         FragmentProgram_FRAGMENT_PROGRAM_BRUSH_LINEAR_COMPOSITION_MODES_COLORDODGE_NOMASK,
7045         FragmentProgram_FRAGMENT_PROGRAM_BRUSH_LINEAR_COMPOSITION_MODES_COLORBURN_NOMASK,
7046         FragmentProgram_FRAGMENT_PROGRAM_BRUSH_LINEAR_COMPOSITION_MODES_HARDLIGHT_NOMASK,
7047         FragmentProgram_FRAGMENT_PROGRAM_BRUSH_LINEAR_COMPOSITION_MODES_SOFTLIGHT_NOMASK,
7048         FragmentProgram_FRAGMENT_PROGRAM_BRUSH_LINEAR_COMPOSITION_MODES_DIFFERENCE_NOMASK,
7049         FragmentProgram_FRAGMENT_PROGRAM_BRUSH_LINEAR_COMPOSITION_MODES_EXCLUSION_NOMASK,
7050         FragmentProgram_FRAGMENT_PROGRAM_BRUSH_LINEAR_COMPOSITION_MODE_BLEND_MODE_MASK,
7051         FragmentProgram_FRAGMENT_PROGRAM_BRUSH_LINEAR_COMPOSITION_MODE_BLEND_MODE_NOMASK,
7052     },
7053     {
7054         FragmentProgram_FRAGMENT_PROGRAM_BRUSH_TEXTURE_COMPOSITION_MODES_SIMPLE_PORTER_DUFF,
7055         FragmentProgram_FRAGMENT_PROGRAM_BRUSH_TEXTURE_COMPOSITION_MODES_MULTIPLY,
7056         FragmentProgram_FRAGMENT_PROGRAM_BRUSH_TEXTURE_COMPOSITION_MODES_SCREEN,
7057         FragmentProgram_FRAGMENT_PROGRAM_BRUSH_TEXTURE_COMPOSITION_MODES_OVERLAY,
7058         FragmentProgram_FRAGMENT_PROGRAM_BRUSH_TEXTURE_COMPOSITION_MODES_DARKEN,
7059         FragmentProgram_FRAGMENT_PROGRAM_BRUSH_TEXTURE_COMPOSITION_MODES_LIGHTEN,
7060         FragmentProgram_FRAGMENT_PROGRAM_BRUSH_TEXTURE_COMPOSITION_MODES_COLORDODGE,
7061         FragmentProgram_FRAGMENT_PROGRAM_BRUSH_TEXTURE_COMPOSITION_MODES_COLORBURN,
7062         FragmentProgram_FRAGMENT_PROGRAM_BRUSH_TEXTURE_COMPOSITION_MODES_HARDLIGHT,
7063         FragmentProgram_FRAGMENT_PROGRAM_BRUSH_TEXTURE_COMPOSITION_MODES_SOFTLIGHT,
7064         FragmentProgram_FRAGMENT_PROGRAM_BRUSH_TEXTURE_COMPOSITION_MODES_DIFFERENCE,
7065         FragmentProgram_FRAGMENT_PROGRAM_BRUSH_TEXTURE_COMPOSITION_MODES_EXCLUSION,
7066         FragmentProgram_FRAGMENT_PROGRAM_BRUSH_TEXTURE_COMPOSITION_MODES_SIMPLE_PORTER_DUFF_NOMASK,
7067         FragmentProgram_FRAGMENT_PROGRAM_BRUSH_TEXTURE_COMPOSITION_MODES_MULTIPLY_NOMASK,
7068         FragmentProgram_FRAGMENT_PROGRAM_BRUSH_TEXTURE_COMPOSITION_MODES_SCREEN_NOMASK,
7069         FragmentProgram_FRAGMENT_PROGRAM_BRUSH_TEXTURE_COMPOSITION_MODES_OVERLAY_NOMASK,
7070         FragmentProgram_FRAGMENT_PROGRAM_BRUSH_TEXTURE_COMPOSITION_MODES_DARKEN_NOMASK,
7071         FragmentProgram_FRAGMENT_PROGRAM_BRUSH_TEXTURE_COMPOSITION_MODES_LIGHTEN_NOMASK,
7072         FragmentProgram_FRAGMENT_PROGRAM_BRUSH_TEXTURE_COMPOSITION_MODES_COLORDODGE_NOMASK,
7073         FragmentProgram_FRAGMENT_PROGRAM_BRUSH_TEXTURE_COMPOSITION_MODES_COLORBURN_NOMASK,
7074         FragmentProgram_FRAGMENT_PROGRAM_BRUSH_TEXTURE_COMPOSITION_MODES_HARDLIGHT_NOMASK,
7075         FragmentProgram_FRAGMENT_PROGRAM_BRUSH_TEXTURE_COMPOSITION_MODES_SOFTLIGHT_NOMASK,
7076         FragmentProgram_FRAGMENT_PROGRAM_BRUSH_TEXTURE_COMPOSITION_MODES_DIFFERENCE_NOMASK,
7077         FragmentProgram_FRAGMENT_PROGRAM_BRUSH_TEXTURE_COMPOSITION_MODES_EXCLUSION_NOMASK,
7078         FragmentProgram_FRAGMENT_PROGRAM_BRUSH_TEXTURE_COMPOSITION_MODE_BLEND_MODE_MASK,
7079         FragmentProgram_FRAGMENT_PROGRAM_BRUSH_TEXTURE_COMPOSITION_MODE_BLEND_MODE_NOMASK,
7080     },
7081     {
7082         FragmentProgram_FRAGMENT_PROGRAM_BRUSH_PATTERN_COMPOSITION_MODES_SIMPLE_PORTER_DUFF,
7083         FragmentProgram_FRAGMENT_PROGRAM_BRUSH_PATTERN_COMPOSITION_MODES_MULTIPLY,
7084         FragmentProgram_FRAGMENT_PROGRAM_BRUSH_PATTERN_COMPOSITION_MODES_SCREEN,
7085         FragmentProgram_FRAGMENT_PROGRAM_BRUSH_PATTERN_COMPOSITION_MODES_OVERLAY,
7086         FragmentProgram_FRAGMENT_PROGRAM_BRUSH_PATTERN_COMPOSITION_MODES_DARKEN,
7087         FragmentProgram_FRAGMENT_PROGRAM_BRUSH_PATTERN_COMPOSITION_MODES_LIGHTEN,
7088         FragmentProgram_FRAGMENT_PROGRAM_BRUSH_PATTERN_COMPOSITION_MODES_COLORDODGE,
7089         FragmentProgram_FRAGMENT_PROGRAM_BRUSH_PATTERN_COMPOSITION_MODES_COLORBURN,
7090         FragmentProgram_FRAGMENT_PROGRAM_BRUSH_PATTERN_COMPOSITION_MODES_HARDLIGHT,
7091         FragmentProgram_FRAGMENT_PROGRAM_BRUSH_PATTERN_COMPOSITION_MODES_SOFTLIGHT,
7092         FragmentProgram_FRAGMENT_PROGRAM_BRUSH_PATTERN_COMPOSITION_MODES_DIFFERENCE,
7093         FragmentProgram_FRAGMENT_PROGRAM_BRUSH_PATTERN_COMPOSITION_MODES_EXCLUSION,
7094         FragmentProgram_FRAGMENT_PROGRAM_BRUSH_PATTERN_COMPOSITION_MODES_SIMPLE_PORTER_DUFF_NOMASK,
7095         FragmentProgram_FRAGMENT_PROGRAM_BRUSH_PATTERN_COMPOSITION_MODES_MULTIPLY_NOMASK,
7096         FragmentProgram_FRAGMENT_PROGRAM_BRUSH_PATTERN_COMPOSITION_MODES_SCREEN_NOMASK,
7097         FragmentProgram_FRAGMENT_PROGRAM_BRUSH_PATTERN_COMPOSITION_MODES_OVERLAY_NOMASK,
7098         FragmentProgram_FRAGMENT_PROGRAM_BRUSH_PATTERN_COMPOSITION_MODES_DARKEN_NOMASK,
7099         FragmentProgram_FRAGMENT_PROGRAM_BRUSH_PATTERN_COMPOSITION_MODES_LIGHTEN_NOMASK,
7100         FragmentProgram_FRAGMENT_PROGRAM_BRUSH_PATTERN_COMPOSITION_MODES_COLORDODGE_NOMASK,
7101         FragmentProgram_FRAGMENT_PROGRAM_BRUSH_PATTERN_COMPOSITION_MODES_COLORBURN_NOMASK,
7102         FragmentProgram_FRAGMENT_PROGRAM_BRUSH_PATTERN_COMPOSITION_MODES_HARDLIGHT_NOMASK,
7103         FragmentProgram_FRAGMENT_PROGRAM_BRUSH_PATTERN_COMPOSITION_MODES_SOFTLIGHT_NOMASK,
7104         FragmentProgram_FRAGMENT_PROGRAM_BRUSH_PATTERN_COMPOSITION_MODES_DIFFERENCE_NOMASK,
7105         FragmentProgram_FRAGMENT_PROGRAM_BRUSH_PATTERN_COMPOSITION_MODES_EXCLUSION_NOMASK,
7106         FragmentProgram_FRAGMENT_PROGRAM_BRUSH_PATTERN_COMPOSITION_MODE_BLEND_MODE_MASK,
7107         FragmentProgram_FRAGMENT_PROGRAM_BRUSH_PATTERN_COMPOSITION_MODE_BLEND_MODE_NOMASK,
7108     },
7109 };
7110 
7111 static int painter_variable_locations[num_fragment_brushes][num_fragment_composition_modes][num_fragment_variables] = {
7112     {
7113         { -1, -1, -1, 2, -1, 0, 5, -1, 1, 3, 1, 0, -1, 4, -1, -1, -1, -1, -1, },
7114         { -1, -1, -1, 0, -1, -1, 3, -1, -1, 1, 1, 0, -1, 2, -1, -1, -1, -1, -1, },
7115         { -1, -1, -1, 0, -1, -1, 3, -1, -1, 1, 1, 0, -1, 2, -1, -1, -1, -1, -1, },
7116         { -1, -1, -1, 0, -1, -1, 3, -1, -1, 1, 1, 0, -1, 2, -1, -1, -1, -1, -1, },
7117         { -1, -1, -1, 0, -1, -1, 3, -1, -1, 1, 1, 0, -1, 2, -1, -1, -1, -1, -1, },
7118         { -1, -1, -1, 0, -1, -1, 3, -1, -1, 1, 1, 0, -1, 2, -1, -1, -1, -1, -1, },
7119         { -1, -1, -1, 0, -1, -1, 3, -1, -1, 1, 1, 0, -1, 2, -1, -1, -1, -1, -1, },
7120         { -1, -1, -1, 0, -1, -1, 3, -1, -1, 1, 1, 0, -1, 2, -1, -1, -1, -1, -1, },
7121         { -1, -1, -1, 0, -1, -1, 3, -1, -1, 1, 1, 0, -1, 2, -1, -1, -1, -1, -1, },
7122         { -1, -1, -1, 0, -1, -1, 3, -1, -1, 1, 1, 0, -1, 2, -1, -1, -1, -1, -1, },
7123         { -1, -1, -1, 0, -1, -1, 3, -1, -1, 1, 1, 0, -1, 2, -1, -1, -1, -1, -1, },
7124         { -1, -1, -1, 0, -1, -1, 3, -1, -1, 1, 1, 0, -1, 2, -1, -1, -1, -1, -1, },
7125         { -1, -1, -1, -1, -1, 0, -1, -1, 1, 2, -1, 0, -1, -1, -1, -1, -1, -1, -1, },
7126         { -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, -1, 0, -1, -1, -1, -1, -1, -1, -1, },
7127         { -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, -1, 0, -1, -1, -1, -1, -1, -1, -1, },
7128         { -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, -1, 0, -1, -1, -1, -1, -1, -1, -1, },
7129         { -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, -1, 0, -1, -1, -1, -1, -1, -1, -1, },
7130         { -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, -1, 0, -1, -1, -1, -1, -1, -1, -1, },
7131         { -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, -1, 0, -1, -1, -1, -1, -1, -1, -1, },
7132         { -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, -1, 0, -1, -1, -1, -1, -1, -1, -1, },
7133         { -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, -1, 0, -1, -1, -1, -1, -1, -1, -1, },
7134         { -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, -1, 0, -1, -1, -1, -1, -1, -1, -1, },
7135         { -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, -1, 0, -1, -1, -1, -1, -1, -1, -1, },
7136         { -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, -1, 0, -1, -1, -1, -1, -1, -1, -1, },
7137         { -1, -1, -1, 0, -1, -1, 2, -1, -1, -1, 0, -1, -1, 1, -1, -1, -1, -1, -1, },
7138         { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, },
7139     },
7140     {
7141         { -1, -1, 3, 7, 4, 5, 10, -1, 6, 8, 1, 0, 2, 9, -1, 1, 0, 2, -1, },
7142         { -1, -1, 3, 5, 4, -1, 8, -1, -1, 6, 1, 0, 2, 7, -1, 1, 0, 2, -1, },
7143         { -1, -1, 3, 5, 4, -1, 8, -1, -1, 6, 1, 0, 2, 7, -1, 1, 0, 2, -1, },
7144         { -1, -1, 3, 5, 4, -1, 8, -1, -1, 6, 1, 0, 2, 7, -1, 1, 0, 2, -1, },
7145         { -1, -1, 3, 5, 4, -1, 8, -1, -1, 6, 1, 0, 2, 7, -1, 1, 0, 2, -1, },
7146         { -1, -1, 3, 5, 4, -1, 8, -1, -1, 6, 1, 0, 2, 7, -1, 1, 0, 2, -1, },
7147         { -1, -1, 3, 5, 4, -1, 8, -1, -1, 6, 1, 0, 2, 7, -1, 1, 0, 2, -1, },
7148         { -1, -1, 3, 5, 4, -1, 8, -1, -1, 6, 1, 0, 2, 7, -1, 1, 0, 2, -1, },
7149         { -1, -1, 3, 5, 4, -1, 8, -1, -1, 6, 1, 0, 2, 7, -1, 1, 0, 2, -1, },
7150         { -1, -1, 3, 5, 4, -1, 8, -1, -1, 6, 1, 0, 2, 7, -1, 1, 0, 2, -1, },
7151         { -1, -1, 3, 5, 4, -1, 8, -1, -1, 6, 1, 0, 2, 7, -1, 1, 0, 2, -1, },
7152         { -1, -1, 3, 5, 4, -1, 8, -1, -1, 6, 1, 0, 2, 7, -1, 1, 0, 2, -1, },
7153         { -1, -1, 3, -1, 4, 5, -1, -1, 6, 7, -1, 0, 1, -1, -1, 1, 0, 2, -1, },
7154         { -1, -1, 3, -1, 4, -1, -1, -1, -1, 5, -1, 0, 1, -1, -1, 1, 0, 2, -1, },
7155         { -1, -1, 3, -1, 4, -1, -1, -1, -1, 5, -1, 0, 1, -1, -1, 1, 0, 2, -1, },
7156         { -1, -1, 3, -1, 4, -1, -1, -1, -1, 5, -1, 0, 1, -1, -1, 1, 0, 2, -1, },
7157         { -1, -1, 3, -1, 4, -1, -1, -1, -1, 5, -1, 0, 1, -1, -1, 1, 0, 2, -1, },
7158         { -1, -1, 3, -1, 4, -1, -1, -1, -1, 5, -1, 0, 1, -1, -1, 1, 0, 2, -1, },
7159         { -1, -1, 3, -1, 4, -1, -1, -1, -1, 5, -1, 0, 1, -1, -1, 1, 0, 2, -1, },
7160         { -1, -1, 3, -1, 4, -1, -1, -1, -1, 5, -1, 0, 1, -1, -1, 1, 0, 2, -1, },
7161         { -1, -1, 3, -1, 4, -1, -1, -1, -1, 5, -1, 0, 1, -1, -1, 1, 0, 2, -1, },
7162         { -1, -1, 3, -1, 4, -1, -1, -1, -1, 5, -1, 0, 1, -1, -1, 1, 0, 2, -1, },
7163         { -1, -1, 3, -1, 4, -1, -1, -1, -1, 5, -1, 0, 1, -1, -1, 1, 0, 2, -1, },
7164         { -1, -1, 3, -1, 4, -1, -1, -1, -1, 5, -1, 0, 1, -1, -1, 1, 0, 2, -1, },
7165         { -1, -1, 3, 5, 4, -1, 7, -1, -1, -1, 0, -1, 1, 6, -1, 1, 0, 2, -1, },
7166         { -1, -1, 3, -1, 4, -1, -1, -1, -1, -1, -1, -1, 0, -1, -1, 1, 0, 2, -1, },
7167     },
7168     {
7169         { -1, -1, 2, 6, 3, 4, 9, -1, 5, 7, 1, 0, 2, 8, -1, -1, -1, 1, 0, },
7170         { -1, -1, 2, 4, 3, -1, 7, -1, -1, 5, 1, 0, 2, 6, -1, -1, -1, 1, 0, },
7171         { -1, -1, 2, 4, 3, -1, 7, -1, -1, 5, 1, 0, 2, 6, -1, -1, -1, 1, 0, },
7172         { -1, -1, 2, 4, 3, -1, 7, -1, -1, 5, 1, 0, 2, 6, -1, -1, -1, 1, 0, },
7173         { -1, -1, 2, 4, 3, -1, 7, -1, -1, 5, 1, 0, 2, 6, -1, -1, -1, 1, 0, },
7174         { -1, -1, 2, 4, 3, -1, 7, -1, -1, 5, 1, 0, 2, 6, -1, -1, -1, 1, 0, },
7175         { -1, -1, 2, 4, 3, -1, 7, -1, -1, 5, 1, 0, 2, 6, -1, -1, -1, 1, 0, },
7176         { -1, -1, 2, 4, 3, -1, 7, -1, -1, 5, 1, 0, 2, 6, -1, -1, -1, 1, 0, },
7177         { -1, -1, 2, 4, 3, -1, 7, -1, -1, 5, 1, 0, 2, 6, -1, -1, -1, 1, 0, },
7178         { -1, -1, 2, 4, 3, -1, 7, -1, -1, 5, 1, 0, 2, 6, -1, -1, -1, 1, 0, },
7179         { -1, -1, 2, 4, 3, -1, 7, -1, -1, 5, 1, 0, 2, 6, -1, -1, -1, 1, 0, },
7180         { -1, -1, 2, 4, 3, -1, 7, -1, -1, 5, 1, 0, 2, 6, -1, -1, -1, 1, 0, },
7181         { -1, -1, 2, -1, 3, 4, -1, -1, 5, 6, -1, 0, 1, -1, -1, -1, -1, 1, 0, },
7182         { -1, -1, 2, -1, 3, -1, -1, -1, -1, 4, -1, 0, 1, -1, -1, -1, -1, 1, 0, },
7183         { -1, -1, 2, -1, 3, -1, -1, -1, -1, 4, -1, 0, 1, -1, -1, -1, -1, 1, 0, },
7184         { -1, -1, 2, -1, 3, -1, -1, -1, -1, 4, -1, 0, 1, -1, -1, -1, -1, 1, 0, },
7185         { -1, -1, 2, -1, 3, -1, -1, -1, -1, 4, -1, 0, 1, -1, -1, -1, -1, 1, 0, },
7186         { -1, -1, 2, -1, 3, -1, -1, -1, -1, 4, -1, 0, 1, -1, -1, -1, -1, 1, 0, },
7187         { -1, -1, 2, -1, 3, -1, -1, -1, -1, 4, -1, 0, 1, -1, -1, -1, -1, 1, 0, },
7188         { -1, -1, 2, -1, 3, -1, -1, -1, -1, 4, -1, 0, 1, -1, -1, -1, -1, 1, 0, },
7189         { -1, -1, 2, -1, 3, -1, -1, -1, -1, 4, -1, 0, 1, -1, -1, -1, -1, 1, 0, },
7190         { -1, -1, 2, -1, 3, -1, -1, -1, -1, 4, -1, 0, 1, -1, -1, -1, -1, 1, 0, },
7191         { -1, -1, 2, -1, 3, -1, -1, -1, -1, 4, -1, 0, 1, -1, -1, -1, -1, 1, 0, },
7192         { -1, -1, 2, -1, 3, -1, -1, -1, -1, 4, -1, 0, 1, -1, -1, -1, -1, 1, 0, },
7193         { -1, -1, 2, 4, 3, -1, 6, -1, -1, -1, 0, -1, 1, 5, -1, -1, -1, 1, 0, },
7194         { -1, -1, 2, -1, 3, -1, -1, -1, -1, -1, -1, -1, 0, -1, -1, -1, -1, 1, 0, },
7195     },
7196     {
7197         { -1, 0, 2, 6, 3, 4, 9, -1, 5, 7, 1, 0, 2, 8, -1, -1, -1, 1, -1, },
7198         { -1, 0, 2, 4, 3, -1, 7, -1, -1, 5, 1, 0, 2, 6, -1, -1, -1, 1, -1, },
7199         { -1, 0, 2, 4, 3, -1, 7, -1, -1, 5, 1, 0, 2, 6, -1, -1, -1, 1, -1, },
7200         { -1, 0, 2, 4, 3, -1, 7, -1, -1, 5, 1, 0, 2, 6, -1, -1, -1, 1, -1, },
7201         { -1, 0, 2, 4, 3, -1, 7, -1, -1, 5, 1, 0, 2, 6, -1, -1, -1, 1, -1, },
7202         { -1, 0, 2, 4, 3, -1, 7, -1, -1, 5, 1, 0, 2, 6, -1, -1, -1, 1, -1, },
7203         { -1, 0, 2, 4, 3, -1, 7, -1, -1, 5, 1, 0, 2, 6, -1, -1, -1, 1, -1, },
7204         { -1, 0, 2, 4, 3, -1, 7, -1, -1, 5, 1, 0, 2, 6, -1, -1, -1, 1, -1, },
7205         { -1, 0, 2, 4, 3, -1, 7, -1, -1, 5, 1, 0, 2, 6, -1, -1, -1, 1, -1, },
7206         { -1, 0, 2, 4, 3, -1, 7, -1, -1, 5, 1, 0, 2, 6, -1, -1, -1, 1, -1, },
7207         { -1, 0, 2, 4, 3, -1, 7, -1, -1, 5, 1, 0, 2, 6, -1, -1, -1, 1, -1, },
7208         { -1, 0, 2, 4, 3, -1, 7, -1, -1, 5, 1, 0, 2, 6, -1, -1, -1, 1, -1, },
7209         { -1, 0, 2, -1, 3, 4, -1, -1, 5, 6, -1, 0, 1, -1, -1, -1, -1, 1, -1, },
7210         { -1, 0, 2, -1, 3, -1, -1, -1, -1, 4, -1, 0, 1, -1, -1, -1, -1, 1, -1, },
7211         { -1, 0, 2, -1, 3, -1, -1, -1, -1, 4, -1, 0, 1, -1, -1, -1, -1, 1, -1, },
7212         { -1, 0, 2, -1, 3, -1, -1, -1, -1, 4, -1, 0, 1, -1, -1, -1, -1, 1, -1, },
7213         { -1, 0, 2, -1, 3, -1, -1, -1, -1, 4, -1, 0, 1, -1, -1, -1, -1, 1, -1, },
7214         { -1, 0, 2, -1, 3, -1, -1, -1, -1, 4, -1, 0, 1, -1, -1, -1, -1, 1, -1, },
7215         { -1, 0, 2, -1, 3, -1, -1, -1, -1, 4, -1, 0, 1, -1, -1, -1, -1, 1, -1, },
7216         { -1, 0, 2, -1, 3, -1, -1, -1, -1, 4, -1, 0, 1, -1, -1, -1, -1, 1, -1, },
7217         { -1, 0, 2, -1, 3, -1, -1, -1, -1, 4, -1, 0, 1, -1, -1, -1, -1, 1, -1, },
7218         { -1, 0, 2, -1, 3, -1, -1, -1, -1, 4, -1, 0, 1, -1, -1, -1, -1, 1, -1, },
7219         { -1, 0, 2, -1, 3, -1, -1, -1, -1, 4, -1, 0, 1, -1, -1, -1, -1, 1, -1, },
7220         { -1, 0, 2, -1, 3, -1, -1, -1, -1, 4, -1, 0, 1, -1, -1, -1, -1, 1, -1, },
7221         { -1, 0, 2, 4, 3, -1, 6, -1, -1, -1, 0, -1, 1, 5, -1, -1, -1, 1, -1, },
7222         { -1, 0, 2, -1, 3, -1, -1, -1, -1, -1, -1, -1, 0, -1, -1, -1, -1, 1, -1, },
7223     },
7224     {
7225         { 2, -1, 2, 6, 3, 4, 9, -1, 5, 7, 1, 0, -1, 8, 0, -1, -1, 1, -1, },
7226         { 2, -1, 2, 4, 3, -1, 7, -1, -1, 5, 1, 0, -1, 6, 0, -1, -1, 1, -1, },
7227         { 2, -1, 2, 4, 3, -1, 7, -1, -1, 5, 1, 0, -1, 6, 0, -1, -1, 1, -1, },
7228         { 2, -1, 2, 4, 3, -1, 7, -1, -1, 5, 1, 0, -1, 6, 0, -1, -1, 1, -1, },
7229         { 2, -1, 2, 4, 3, -1, 7, -1, -1, 5, 1, 0, -1, 6, 0, -1, -1, 1, -1, },
7230         { 2, -1, 2, 4, 3, -1, 7, -1, -1, 5, 1, 0, -1, 6, 0, -1, -1, 1, -1, },
7231         { 2, -1, 2, 4, 3, -1, 7, -1, -1, 5, 1, 0, -1, 6, 0, -1, -1, 1, -1, },
7232         { 2, -1, 2, 4, 3, -1, 7, -1, -1, 5, 1, 0, -1, 6, 0, -1, -1, 1, -1, },
7233         { 2, -1, 2, 4, 3, -1, 7, -1, -1, 5, 1, 0, -1, 6, 0, -1, -1, 1, -1, },
7234         { 2, -1, 2, 4, 3, -1, 7, -1, -1, 5, 1, 0, -1, 6, 0, -1, -1, 1, -1, },
7235         { 2, -1, 2, 4, 3, -1, 7, -1, -1, 5, 1, 0, -1, 6, 0, -1, -1, 1, -1, },
7236         { 2, -1, 2, 4, 3, -1, 7, -1, -1, 5, 1, 0, -1, 6, 0, -1, -1, 1, -1, },
7237         { 1, -1, 2, -1, 3, 4, -1, -1, 5, 6, -1, 0, -1, -1, 0, -1, -1, 1, -1, },
7238         { 1, -1, 2, -1, 3, -1, -1, -1, -1, 4, -1, 0, -1, -1, 0, -1, -1, 1, -1, },
7239         { 1, -1, 2, -1, 3, -1, -1, -1, -1, 4, -1, 0, -1, -1, 0, -1, -1, 1, -1, },
7240         { 1, -1, 2, -1, 3, -1, -1, -1, -1, 4, -1, 0, -1, -1, 0, -1, -1, 1, -1, },
7241         { 1, -1, 2, -1, 3, -1, -1, -1, -1, 4, -1, 0, -1, -1, 0, -1, -1, 1, -1, },
7242         { 1, -1, 2, -1, 3, -1, -1, -1, -1, 4, -1, 0, -1, -1, 0, -1, -1, 1, -1, },
7243         { 1, -1, 2, -1, 3, -1, -1, -1, -1, 4, -1, 0, -1, -1, 0, -1, -1, 1, -1, },
7244         { 1, -1, 2, -1, 3, -1, -1, -1, -1, 4, -1, 0, -1, -1, 0, -1, -1, 1, -1, },
7245         { 1, -1, 2, -1, 3, -1, -1, -1, -1, 4, -1, 0, -1, -1, 0, -1, -1, 1, -1, },
7246         { 1, -1, 2, -1, 3, -1, -1, -1, -1, 4, -1, 0, -1, -1, 0, -1, -1, 1, -1, },
7247         { 1, -1, 2, -1, 3, -1, -1, -1, -1, 4, -1, 0, -1, -1, 0, -1, -1, 1, -1, },
7248         { 1, -1, 2, -1, 3, -1, -1, -1, -1, 4, -1, 0, -1, -1, 0, -1, -1, 1, -1, },
7249         { 1, -1, 2, 4, 3, -1, 6, -1, -1, -1, 0, -1, -1, 5, 0, -1, -1, 1, -1, },
7250         { 0, -1, 2, -1, 3, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, -1, -1, 1, -1, },
7251     },
7252     {
7253         { 2, -1, 2, 6, 3, 4, 9, -1, 5, 7, 1, 0, -1, 8, 0, -1, -1, 1, -1, },
7254         { 2, -1, 2, 4, 3, -1, 7, -1, -1, 5, 1, 0, -1, 6, 0, -1, -1, 1, -1, },
7255         { 2, -1, 2, 4, 3, -1, 7, -1, -1, 5, 1, 0, -1, 6, 0, -1, -1, 1, -1, },
7256         { 2, -1, 2, 4, 3, -1, 7, -1, -1, 5, 1, 0, -1, 6, 0, -1, -1, 1, -1, },
7257         { 2, -1, 2, 4, 3, -1, 7, -1, -1, 5, 1, 0, -1, 6, 0, -1, -1, 1, -1, },
7258         { 2, -1, 2, 4, 3, -1, 7, -1, -1, 5, 1, 0, -1, 6, 0, -1, -1, 1, -1, },
7259         { 2, -1, 2, 4, 3, -1, 7, -1, -1, 5, 1, 0, -1, 6, 0, -1, -1, 1, -1, },
7260         { 2, -1, 2, 4, 3, -1, 7, -1, -1, 5, 1, 0, -1, 6, 0, -1, -1, 1, -1, },
7261         { 2, -1, 2, 4, 3, -1, 7, -1, -1, 5, 1, 0, -1, 6, 0, -1, -1, 1, -1, },
7262         { 2, -1, 2, 4, 3, -1, 7, -1, -1, 5, 1, 0, -1, 6, 0, -1, -1, 1, -1, },
7263         { 2, -1, 2, 4, 3, -1, 7, -1, -1, 5, 1, 0, -1, 6, 0, -1, -1, 1, -1, },
7264         { 2, -1, 2, 4, 3, -1, 7, -1, -1, 5, 1, 0, -1, 6, 0, -1, -1, 1, -1, },
7265         { 1, -1, 2, -1, 3, 4, -1, -1, 5, 6, -1, 0, -1, -1, 0, -1, -1, 1, -1, },
7266         { 1, -1, 2, -1, 3, -1, -1, -1, -1, 4, -1, 0, -1, -1, 0, -1, -1, 1, -1, },
7267         { 1, -1, 2, -1, 3, -1, -1, -1, -1, 4, -1, 0, -1, -1, 0, -1, -1, 1, -1, },
7268         { 1, -1, 2, -1, 3, -1, -1, -1, -1, 4, -1, 0, -1, -1, 0, -1, -1, 1, -1, },
7269         { 1, -1, 2, -1, 3, -1, -1, -1, -1, 4, -1, 0, -1, -1, 0, -1, -1, 1, -1, },
7270         { 1, -1, 2, -1, 3, -1, -1, -1, -1, 4, -1, 0, -1, -1, 0, -1, -1, 1, -1, },
7271         { 1, -1, 2, -1, 3, -1, -1, -1, -1, 4, -1, 0, -1, -1, 0, -1, -1, 1, -1, },
7272         { 1, -1, 2, -1, 3, -1, -1, -1, -1, 4, -1, 0, -1, -1, 0, -1, -1, 1, -1, },
7273         { 1, -1, 2, -1, 3, -1, -1, -1, -1, 4, -1, 0, -1, -1, 0, -1, -1, 1, -1, },
7274         { 1, -1, 2, -1, 3, -1, -1, -1, -1, 4, -1, 0, -1, -1, 0, -1, -1, 1, -1, },
7275         { 1, -1, 2, -1, 3, -1, -1, -1, -1, 4, -1, 0, -1, -1, 0, -1, -1, 1, -1, },
7276         { 1, -1, 2, -1, 3, -1, -1, -1, -1, 4, -1, 0, -1, -1, 0, -1, -1, 1, -1, },
7277         { 1, -1, 2, 4, 3, -1, 6, -1, -1, -1, 0, -1, -1, 5, 0, -1, -1, 1, -1, },
7278         { 0, -1, 2, -1, 3, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, -1, -1, 1, -1, },
7279     },
7280 };
7281 
7282 static int mask_variable_locations[num_fragment_masks][num_fragment_variables] = {
7283     { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, },
7284     { -1, -1, 1, -1, 2, -1, -1, 3, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, -1, },
7285 };
7286 
7287 #endif
7288