source: trunk/src/opengl/util/fragmentprograms_p.h@ 134

Last change on this file since 134 was 2, checked in by Dmitry A. Kuminov, 16 years ago

Initially imported qt-all-opensource-src-4.5.1 from Trolltech.

File size: 240.5 KB
Line 
1/****************************************************************************
2**
3** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
4** Contact: Qt Software Information ([email protected])
5**
6** This file is part of the QtOpenGL module of the Qt Toolkit.
7**
8** $QT_BEGIN_LICENSE:LGPL$
9** Commercial Usage
10** Licensees holding valid Qt Commercial licenses may use this file in
11** accordance with the Qt Commercial License Agreement provided with the
12** Software or, alternatively, in accordance with the terms contained in
13** a written agreement between you and Nokia.
14**
15** GNU Lesser General Public License Usage
16** Alternatively, this file may be used under the terms of the GNU Lesser
17** General Public License version 2.1 as published by the Free Software
18** Foundation and appearing in the file LICENSE.LGPL included in the
19** packaging of this file. Please review the following information to
20** ensure the GNU Lesser General Public License version 2.1 requirements
21** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
22**
23** In addition, as a special exception, Nokia gives you certain
24** additional rights. These rights are described in the Nokia Qt LGPL
25** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
26** package.
27**
28** GNU General Public License Usage
29** Alternatively, this file may be used under the terms of the GNU
30** General Public License version 3.0 as published by the Free Software
31** Foundation and appearing in the file LICENSE.GPL included in the
32** packaging of this file. Please review the following information to
33** ensure the GNU General Public License version 3.0 requirements will be
34** met: http://www.gnu.org/copyleft/gpl.html.
35**
36** If you are unsure which license is appropriate for your use, please
37** contact the sales department at [email protected].
38** $QT_END_LICENSE$
39**
40****************************************************************************/
41#ifndef FRAGMENTPROGRAMS_H
42#define FRAGMENTPROGRAMS_H
43
44//
45// W A R N I N G
46// -------------
47//
48// This file is not part of the Qt API. It exists purely as an
49// implementation detail. This header file may change from version to
50// version without notice, or even be removed.
51//
52// We mean it.
53//
54
55enum FragmentVariable {
56 VAR_BRUSH_TEXTURE,
57 VAR_LINEAR,
58 VAR_INV_MATRIX_M1,
59 VAR_INV_MASK_SIZE,
60 VAR_INV_MATRIX_M2,
61 VAR_PORTERDUFF_AB,
62 VAR_MASK_CHANNEL,
63 VAR_ELLIPSE_OFFSET,
64 VAR_PORTERDUFF_XYZ,
65 VAR_INV_DST_SIZE,
66 VAR_MASK_TEXTURE,
67 VAR_DST_TEXTURE,
68 VAR_PALETTE,
69 VAR_MASK_OFFSET,
70 VAR_INV_BRUSH_TEXTURE_SIZE,
71 VAR_FMP2_M_RADIUS2,
72 VAR_FMP,
73 VAR_INV_MATRIX_M0,
74 VAR_ANGLE,
75};
76
77enum FragmentBrushType {
78 FRAGMENT_PROGRAM_BRUSH_SOLID,
79 FRAGMENT_PROGRAM_BRUSH_RADIAL,
80 FRAGMENT_PROGRAM_BRUSH_CONICAL,
81 FRAGMENT_PROGRAM_BRUSH_LINEAR,
82 FRAGMENT_PROGRAM_BRUSH_TEXTURE,
83 FRAGMENT_PROGRAM_BRUSH_PATTERN,
84};
85
86enum FragmentCompositionModeType {
87 COMPOSITION_MODES_SIMPLE_PORTER_DUFF,
88 COMPOSITION_MODES_MULTIPLY,
89 COMPOSITION_MODES_SCREEN,
90 COMPOSITION_MODES_OVERLAY,
91 COMPOSITION_MODES_DARKEN,
92 COMPOSITION_MODES_LIGHTEN,
93 COMPOSITION_MODES_COLORDODGE,
94 COMPOSITION_MODES_COLORBURN,
95 COMPOSITION_MODES_HARDLIGHT,
96 COMPOSITION_MODES_SOFTLIGHT,
97 COMPOSITION_MODES_DIFFERENCE,
98 COMPOSITION_MODES_EXCLUSION,
99 COMPOSITION_MODES_SIMPLE_PORTER_DUFF_NOMASK,
100 COMPOSITION_MODES_MULTIPLY_NOMASK,
101 COMPOSITION_MODES_SCREEN_NOMASK,
102 COMPOSITION_MODES_OVERLAY_NOMASK,
103 COMPOSITION_MODES_DARKEN_NOMASK,
104 COMPOSITION_MODES_LIGHTEN_NOMASK,
105 COMPOSITION_MODES_COLORDODGE_NOMASK,
106 COMPOSITION_MODES_COLORBURN_NOMASK,
107 COMPOSITION_MODES_HARDLIGHT_NOMASK,
108 COMPOSITION_MODES_SOFTLIGHT_NOMASK,
109 COMPOSITION_MODES_DIFFERENCE_NOMASK,
110 COMPOSITION_MODES_EXCLUSION_NOMASK,
111 COMPOSITION_MODE_BLEND_MODE_MASK,
112 COMPOSITION_MODE_BLEND_MODE_NOMASK,
113};
114
115enum FragmentMaskType {
116 FRAGMENT_PROGRAM_MASK_TRAPEZOID_AA,
117 FRAGMENT_PROGRAM_MASK_ELLIPSE_AA,
118};
119
120static const unsigned int num_fragment_variables = 19;
121
122static const unsigned int num_fragment_brushes = 6;
123static const unsigned int num_fragment_composition_modes = 26;
124static const unsigned int num_fragment_masks = 2;
125
126static const char *FragmentProgram_FRAGMENT_PROGRAM_MASK_TRAPEZOID_AA =
127 "!!ARBfp1.0\n"
128 "PARAM c[1] = { { 0.5, 2 } };\n"
129 "TEMP R0;\n"
130 "TEMP R1;\n"
131 "TEMP R2;\n"
132 "TEMP R3;\n"
133 "TEMP R4;\n"
134 "ADD R4.x, fragment.position, c[0];\n"
135 "ADD R0.y, fragment.position, -c[0].x;\n"
136 "MAX R2.x, R0.y, fragment.texcoord[0].y;\n"
137 "ADD R0.x, fragment.position.y, c[0];\n"
138 "MIN R2.y, R0.x, fragment.texcoord[0].x;\n"
139 "ADD R3.x, fragment.position, -c[0];\n"
140 "ADD R1.zw, -fragment.texcoord[0], -fragment.texcoord[0];\n"
141 "MOV R3.y, R4.x;\n"
142 "MOV R0.yw, R2.x;\n"
143 "MOV R0.xz, R2.y;\n"
144 "MAD R0, fragment.texcoord[1].xxzz, R0, fragment.texcoord[1].yyww;\n"
145 "MAD R1.xy, fragment.position.x, c[0].y, -R0.zwzw;\n"
146 "MOV R0.w, R1.x;\n"
147 "MOV R1.x, R0.y;\n"
148 "MOV R0.z, R0.x;\n"
149 "SGE R2.zw, R1.xyxy, R0;\n"
150 "MAX R0.xy, R0.zwzw, R1;\n"
151 "MIN R0.zw, R0, R1.xyxy;\n"
152 "MAD R2.zw, R2, R1, fragment.texcoord[0];\n"
153 "ADD R1, R3.xyxy, -R0.zzww;\n"
154 "MAD R1, R1, R2.zzww, R2.x;\n"
155 "ADD R3.zw, R0.xyxy, R0;\n"
156 "ADD R3.y, R2, -R2.x;\n"
157 "ADD R2.zw, R1.xyyw, -R2.x;\n"
158 "ADD R4.zw, R4.x, -R0;\n"
159 "MUL R2.zw, R4, R2;\n"
160 "ADD R4.zw, R1.xyyw, R1.xyxz;\n"
161 "ADD R1.xz, R2.y, -R1;\n"
162 "MAD R2.zw, -R2, c[0].x, R3.y;\n"
163 "MAD R3.zw, R3, c[0].x, -R3.x;\n"
164 "MAD R3.zw, R3, R3.y, -R2;\n"
165 "ADD R1.y, R4.x, -R3.x;\n"
166 "MAD R4.zw, -R4, c[0].x, R2.y;\n"
167 "MUL R4.zw, R4, R1.y;\n"
168 "ADD R1.yw, R0.xxzy, -R3.x;\n"
169 "MUL R1.xy, R1.xzzw, R1.ywzw;\n"
170 "MAD R1.zw, R1.xyxy, c[0].x, -R4;\n"
171 "SGE R1.xy, R4.x, R0;\n"
172 "MUL R1.zw, R1.xyxy, R1;\n"
173 "MAD R1.xy, R1, R3.zwzw, R2.zwzw;\n"
174 "SGE R2.zw, R3.x, R0;\n"
175 "ADD R1.zw, R4, R1;\n"
176 "ADD R1.zw, R1, -R1.xyxy;\n"
177 "MAD R1.xy, R2.zwzw, R1.zwzw, R1;\n"
178 "ADD R1.xy, R1, -R3.y;\n"
179 "SGE R0.zw, R4.x, R0;\n"
180 "MAD R0.zw, R0, R1.xyxy, R3.y;\n"
181 "SGE R0.xy, R0, R3.x;\n"
182 "MUL R0.xy, R0.zwzw, R0;\n"
183 "ADD R0.x, R3.y, -R0;\n"
184 "SGE R0.z, R2.y, R2.x;\n"
185 "ADD R0.x, R0, -R0.y;\n"
186 "MUL result.color, R0.x, R0.z;\n"
187 "END\n"
188 ;
189
190static 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[0];\n"
199 "MUL R1.xyz, R0.y, c[2];\n"
200 "MAD R0.xyz, R0.x, c[1], R1;\n"
201 "ADD R0.xyz, R0, c[3];\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[1];\n"
206 "MOV R1.zw, c[2].xyxy;\n"
207 "MOV R0.x, c[1].z;\n"
208 "MOV R0.y, c[2].z;\n"
209 "MAD R0, -R0.xyxy, R0.zzww, R1.xzyw;\n"
210 "MUL R1.xy, R2, fragment.texcoord[0];\n"
211 "MUL R0, R0, R2.z;\n"
212 "MUL R1.xy, R1, c[4].x;\n"
213 "MUL R1.zw, R1.xyxy, R0.xyxz;\n"
214 "MUL R0.xy, R1, R0.ywzw;\n"
215 "ADD R0.w, R0.x, R0.y;\n"
216 "MUL R0.xy, R2, R2;\n"
217 "ADD R0.x, R0, R0.y;\n"
218 "ADD R0.z, R1, R1.w;\n"
219 "MUL R0.zw, R0, R0;\n"
220 "ADD R0.y, R0.z, R0.w;\n"
221 "RSQ R0.y, R0.y;\n"
222 "ADD R0.x, -R0, c[4].y;\n"
223 "MAD_SAT R0.x, R0.y, R0, -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
231static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_SOLID_COMPOSITION_MODES_SIMPLE_PORTER_DUFF =
232 "!!ARBfp1.0\n"
233 "PARAM c[7] = { program.local[0..3],\n"
234 " { 1 },\n"
235 " program.local[5..6] };\n"
236 "TEMP R0;\n"
237 "TEMP R1;\n"
238 "TEMP R2;\n"
239 "TEMP R3;\n"
240 "MUL R0.xy, fragment.position, c[3];\n"
241 "TEX R1, R0, texture[0], 2D;\n"
242 "MUL R0.xyz, R1, c[6].y;\n"
243 "MUL R2.xyz, R0, fragment.color.primary.w;\n"
244 "MUL R0.xyz, fragment.color.primary, c[6].x;\n"
245 "MAD R2.xyz, R0, R1.w, R2;\n"
246 "ADD R3.xy, fragment.position, c[0];\n"
247 "ADD R0.w, -R1, c[4].x;\n"
248 "MUL R0.xyz, fragment.color.primary, c[5].y;\n"
249 "MAD R2.xyz, R0, R0.w, R2;\n"
250 "MUL R0.xyz, R1, c[5].z;\n"
251 "ADD R0.w, -fragment.color.primary, c[4].x;\n"
252 "MAD R2.xyz, R0, R0.w, R2;\n"
253 "ADD R0.y, -R1.w, c[4].x;\n"
254 "MUL R0.x, fragment.color.primary.w, R1.w;\n"
255 "MUL R0.y, fragment.color.primary.w, R0;\n"
256 "MUL R0.z, R1.w, R0.w;\n"
257 "DP3 R2.w, R0, c[5];\n"
258 "MUL R3.xy, R3, c[1];\n"
259 "TEX R0, R3, texture[1], 2D;\n"
260 "ADD R2, R2, -R1;\n"
261 "DP4 R0.x, R0, c[2];\n"
262 "MAD result.color, R0.x, R2, R1;\n"
263 "END\n"
264 ;
265
266static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_SOLID_COMPOSITION_MODES_MULTIPLY =
267 "!!ARBfp1.0\n"
268 "PARAM c[5] = { program.local[0..3],\n"
269 " { 1 } };\n"
270 "TEMP R0;\n"
271 "TEMP R1;\n"
272 "TEMP R2;\n"
273 "MUL R0.xy, fragment.position, c[3];\n"
274 "TEX R1, R0, texture[0], 2D;\n"
275 "ADD R0.x, -R1.w, c[4];\n"
276 "MUL R0.xyz, fragment.color.primary, R0.x;\n"
277 "MAD R0.xyz, fragment.color.primary, R1, R0;\n"
278 "ADD R0.w, -fragment.color.primary, c[4].x;\n"
279 "MAD R2.xyz, R1, R0.w, R0;\n"
280 "ADD R0.z, fragment.color.primary.w, R1.w;\n"
281 "MAD R2.w, -fragment.color.primary, R1, R0.z;\n"
282 "ADD R0.xy, fragment.position, c[0];\n"
283 "MUL R0.xy, R0, c[1];\n"
284 "TEX R0, R0, texture[1], 2D;\n"
285 "ADD R2, R2, -R1;\n"
286 "DP4 R0.x, R0, c[2];\n"
287 "MAD result.color, R0.x, R2, R1;\n"
288 "END\n"
289 ;
290
291static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_SOLID_COMPOSITION_MODES_SCREEN =
292 "!!ARBfp1.0\n"
293 "PARAM c[4] = { program.local[0..3] };\n"
294 "TEMP R0;\n"
295 "TEMP R1;\n"
296 "TEMP R2;\n"
297 "MUL R0.xy, fragment.position, c[3];\n"
298 "TEX R1, R0, texture[0], 2D;\n"
299 "ADD R0.xy, fragment.position, c[0];\n"
300 "ADD R2, fragment.color.primary, R1;\n"
301 "MUL R0.xy, R0, c[1];\n"
302 "MAD R2, -fragment.color.primary, R1, R2;\n"
303 "TEX R0, R0, texture[1], 2D;\n"
304 "ADD R2, R2, -R1;\n"
305 "DP4 R0.x, R0, c[2];\n"
306 "MAD result.color, R0.x, R2, R1;\n"
307 "END\n"
308 ;
309
310static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_SOLID_COMPOSITION_MODES_OVERLAY =
311 "!!ARBfp1.0\n"
312 "PARAM c[5] = { program.local[0..3],\n"
313 " { 2, 1 } };\n"
314 "TEMP R0;\n"
315 "TEMP R1;\n"
316 "TEMP R2;\n"
317 "TEMP R3;\n"
318 "MUL R0.xy, fragment.position, c[3];\n"
319 "TEX R1, R0, texture[0], 2D;\n"
320 "ADD R0.w, -R1, c[4].y;\n"
321 "MUL R3.xyz, fragment.color.primary, R0.w;\n"
322 "ADD R2.xyz, fragment.color.primary.w, -fragment.color.primary;\n"
323 "ADD R0.xyz, R1.w, -R1;\n"
324 "MUL R0.xyz, R0, R2;\n"
325 "MUL R0.xyz, R0, c[4].x;\n"
326 "MAD R0.xyz, fragment.color.primary.w, R1.w, -R0;\n"
327 "MAD R0.xyz, fragment.color.primary, R0.w, R0;\n"
328 "MUL R2.xyz, fragment.color.primary, R1;\n"
329 "MAD R2.xyz, R2, c[4].x, R3;\n"
330 "ADD R0.w, -fragment.color.primary, c[4].y;\n"
331 "MAD R3.xyz, R1, R0.w, R0;\n"
332 "MAD R2.xyz, R1, R0.w, R2;\n"
333 "MUL R0.xyz, R1, c[4].x;\n"
334 "SGE R0.xyz, R0, R1.w;\n"
335 "ADD R3.xyz, R3, -R2;\n"
336 "MAD R2.xyz, R0, R3, R2;\n"
337 "ADD R0.z, fragment.color.primary.w, R1.w;\n"
338 "MAD R2.w, -fragment.color.primary, R1, R0.z;\n"
339 "ADD R0.xy, fragment.position, c[0];\n"
340 "MUL R0.xy, R0, c[1];\n"
341 "TEX R0, R0, texture[1], 2D;\n"
342 "ADD R2, R2, -R1;\n"
343 "DP4 R0.x, R0, c[2];\n"
344 "MAD result.color, R0.x, R2, R1;\n"
345 "END\n"
346 ;
347
348static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_SOLID_COMPOSITION_MODES_DARKEN =
349 "!!ARBfp1.0\n"
350 "PARAM c[5] = { program.local[0..3],\n"
351 " { 1 } };\n"
352 "TEMP R0;\n"
353 "TEMP R1;\n"
354 "TEMP R2;\n"
355 "MUL R0.xy, fragment.position, c[3];\n"
356 "TEX R1, R0, texture[0], 2D;\n"
357 "MUL R2.xyz, R1, fragment.color.primary.w;\n"
358 "MUL R0.xyz, fragment.color.primary, R1.w;\n"
359 "MIN R0.xyz, R0, R2;\n"
360 "ADD R0.w, -R1, c[4].x;\n"
361 "MAD R0.xyz, fragment.color.primary, R0.w, R0;\n"
362 "ADD R0.w, -fragment.color.primary, c[4].x;\n"
363 "MAD R2.xyz, R1, R0.w, R0;\n"
364 "ADD R0.z, fragment.color.primary.w, R1.w;\n"
365 "MAD R2.w, -fragment.color.primary, R1, R0.z;\n"
366 "ADD R0.xy, fragment.position, c[0];\n"
367 "MUL R0.xy, R0, c[1];\n"
368 "TEX R0, R0, texture[1], 2D;\n"
369 "ADD R2, R2, -R1;\n"
370 "DP4 R0.x, R0, c[2];\n"
371 "MAD result.color, R0.x, R2, R1;\n"
372 "END\n"
373 ;
374
375static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_SOLID_COMPOSITION_MODES_LIGHTEN =
376 "!!ARBfp1.0\n"
377 "PARAM c[5] = { program.local[0..3],\n"
378 " { 1 } };\n"
379 "TEMP R0;\n"
380 "TEMP R1;\n"
381 "TEMP R2;\n"
382 "MUL R0.xy, fragment.position, c[3];\n"
383 "TEX R1, R0, texture[0], 2D;\n"
384 "MUL R2.xyz, R1, fragment.color.primary.w;\n"
385 "MUL R0.xyz, fragment.color.primary, R1.w;\n"
386 "MAX R0.xyz, R0, R2;\n"
387 "ADD R0.w, -R1, c[4].x;\n"
388 "MAD R0.xyz, fragment.color.primary, R0.w, R0;\n"
389 "ADD R0.w, -fragment.color.primary, c[4].x;\n"
390 "MAD R2.xyz, R1, R0.w, R0;\n"
391 "ADD R0.z, fragment.color.primary.w, R1.w;\n"
392 "MAD R2.w, -fragment.color.primary, R1, R0.z;\n"
393 "ADD R0.xy, fragment.position, c[0];\n"
394 "MUL R0.xy, R0, c[1];\n"
395 "TEX R0, R0, texture[1], 2D;\n"
396 "ADD R2, R2, -R1;\n"
397 "DP4 R0.x, R0, c[2];\n"
398 "MAD result.color, R0.x, R2, R1;\n"
399 "END\n"
400 ;
401
402static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_SOLID_COMPOSITION_MODES_COLORDODGE =
403 "!!ARBfp1.0\n"
404 "PARAM c[5] = { program.local[0..3],\n"
405 " { 1, 1e-06 } };\n"
406 "TEMP R0;\n"
407 "TEMP R1;\n"
408 "TEMP R2;\n"
409 "TEMP R3;\n"
410 "MUL R0.xy, fragment.position, c[3];\n"
411 "TEX R0, R0, texture[0], 2D;\n"
412 "ADD R1.y, -fragment.color.primary.w, c[4].x;\n"
413 "MAX R1.x, fragment.color.primary.w, c[4].y;\n"
414 "MUL R2.xyz, R0, R1.y;\n"
415 "ADD R1.w, -R0, c[4].x;\n"
416 "MAD R3.xyz, fragment.color.primary, R1.w, R2;\n"
417 "RCP R1.x, R1.x;\n"
418 "MAD R1.xyz, -fragment.color.primary, R1.x, c[4].x;\n"
419 "MAX R1.xyz, R1, c[4].y;\n"
420 "MUL R2.xyz, R0, fragment.color.primary.w;\n"
421 "MUL R1.w, fragment.color.primary, R0;\n"
422 "RCP R1.x, R1.x;\n"
423 "RCP R1.y, R1.y;\n"
424 "RCP R1.z, R1.z;\n"
425 "MAD R1.xyz, R2, R1, R3;\n"
426 "MAD R3.xyz, fragment.color.primary.w, R0.w, R3;\n"
427 "MAD R2.xyz, fragment.color.primary, R0.w, R2;\n"
428 "ADD R3.xyz, R3, -R1;\n"
429 "SGE R2.xyz, R2, R1.w;\n"
430 "MAD R2.xyz, R2, R3, R1;\n"
431 "ADD R1.z, fragment.color.primary.w, R0.w;\n"
432 "MAD R2.w, -fragment.color.primary, R0, R1.z;\n"
433 "ADD R1.xy, fragment.position, c[0];\n"
434 "MUL R1.xy, R1, c[1];\n"
435 "TEX R1, R1, texture[1], 2D;\n"
436 "ADD R2, R2, -R0;\n"
437 "DP4 R1.x, R1, c[2];\n"
438 "MAD result.color, R1.x, R2, R0;\n"
439 "END\n"
440 ;
441
442static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_SOLID_COMPOSITION_MODES_COLORBURN =
443 "!!ARBfp1.0\n"
444 "PARAM c[5] = { program.local[0..3],\n"
445 " { 1, 9.9999997e-06 } };\n"
446 "TEMP R0;\n"
447 "TEMP R1;\n"
448 "TEMP R2;\n"
449 "TEMP R3;\n"
450 "TEMP R4;\n"
451 "MUL R0.xy, fragment.position, c[3];\n"
452 "TEX R0, R0, texture[0], 2D;\n"
453 "ADD R1.w, -R0, c[4].x;\n"
454 "MUL R1.xyz, R0, fragment.color.primary.w;\n"
455 "MAD R2.xyz, fragment.color.primary, R0.w, R1;\n"
456 "MAD R1.xyz, -fragment.color.primary.w, R0.w, R2;\n"
457 "MUL R3.xyz, fragment.color.primary.w, R1;\n"
458 "MAX R1.xyz, fragment.color.primary, c[4].y;\n"
459 "MUL R4.xyz, fragment.color.primary, R1.w;\n"
460 "RCP R1.x, R1.x;\n"
461 "RCP R1.y, R1.y;\n"
462 "RCP R1.z, R1.z;\n"
463 "MAD R3.xyz, R3, R1, R4;\n"
464 "ADD R2.w, -fragment.color.primary, c[4].x;\n"
465 "MUL R1.xyz, R0, R2.w;\n"
466 "MAD R1.xyz, fragment.color.primary, R1.w, R1;\n"
467 "ADD R2.w, -fragment.color.primary, c[4].x;\n"
468 "MAD R3.xyz, R0, R2.w, R3;\n"
469 "MUL R1.w, fragment.color.primary, R0;\n"
470 "ADD R3.xyz, R3, -R1;\n"
471 "SGE R2.xyz, R2, R1.w;\n"
472 "MAD R2.xyz, R2, R3, R1;\n"
473 "ADD R1.z, fragment.color.primary.w, R0.w;\n"
474 "MAD R2.w, -fragment.color.primary, R0, R1.z;\n"
475 "ADD R1.xy, fragment.position, c[0];\n"
476 "MUL R1.xy, R1, c[1];\n"
477 "TEX R1, R1, texture[1], 2D;\n"
478 "ADD R2, R2, -R0;\n"
479 "DP4 R1.x, R1, c[2];\n"
480 "MAD result.color, R1.x, R2, R0;\n"
481 "END\n"
482 ;
483
484static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_SOLID_COMPOSITION_MODES_HARDLIGHT =
485 "!!ARBfp1.0\n"
486 "PARAM c[5] = { program.local[0..3],\n"
487 " { 2, 1 } };\n"
488 "TEMP R0;\n"
489 "TEMP R1;\n"
490 "TEMP R2;\n"
491 "TEMP R3;\n"
492 "MUL R0.xy, fragment.position, c[3];\n"
493 "TEX R1, R0, texture[0], 2D;\n"
494 "ADD R0.w, -R1, c[4].y;\n"
495 "MUL R3.xyz, fragment.color.primary, R0.w;\n"
496 "ADD R2.xyz, fragment.color.primary.w, -fragment.color.primary;\n"
497 "ADD R0.xyz, R1.w, -R1;\n"
498 "MUL R0.xyz, R0, R2;\n"
499 "MUL R0.xyz, R0, c[4].x;\n"
500 "MAD R0.xyz, fragment.color.primary.w, R1.w, -R0;\n"
501 "MAD R0.xyz, fragment.color.primary, R0.w, R0;\n"
502 "MUL R2.xyz, fragment.color.primary, R1;\n"
503 "MAD R2.xyz, R2, c[4].x, R3;\n"
504 "ADD R0.w, -fragment.color.primary, c[4].y;\n"
505 "MAD R3.xyz, R1, R0.w, R0;\n"
506 "MAD R2.xyz, R1, R0.w, R2;\n"
507 "MUL R0.xyz, fragment.color.primary, c[4].x;\n"
508 "SGE R0.xyz, R0, fragment.color.primary.w;\n"
509 "ADD R3.xyz, R3, -R2;\n"
510 "MAD R2.xyz, R0, R3, R2;\n"
511 "ADD R0.z, fragment.color.primary.w, R1.w;\n"
512 "MAD R2.w, -fragment.color.primary, R1, R0.z;\n"
513 "ADD R0.xy, fragment.position, c[0];\n"
514 "MUL R0.xy, R0, c[1];\n"
515 "TEX R0, R0, texture[1], 2D;\n"
516 "ADD R2, R2, -R1;\n"
517 "DP4 R0.x, R0, c[2];\n"
518 "MAD result.color, R0.x, R2, R1;\n"
519 "END\n"
520 ;
521
522static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_SOLID_COMPOSITION_MODES_SOFTLIGHT =
523 "!!ARBfp1.0\n"
524 "PARAM c[6] = { program.local[0..3],\n"
525 " { 1, 9.9999997e-06, 2, 8 },\n"
526 " { 3 } };\n"
527 "TEMP R0;\n"
528 "TEMP R1;\n"
529 "TEMP R2;\n"
530 "TEMP R3;\n"
531 "TEMP R4;\n"
532 "TEMP R5;\n"
533 "MUL R0.xy, fragment.position, c[3];\n"
534 "TEX R0, R0, texture[0], 2D;\n"
535 "MAX R1.x, R0.w, c[4].y;\n"
536 "RCP R1.w, R1.x;\n"
537 "MUL R2.xyz, R0, R1.w;\n"
538 "MUL R1.xyz, -R2, c[4].w;\n"
539 "RSQ R2.w, R2.x;\n"
540 "ADD R4.xyz, R1, c[5].x;\n"
541 "MAD R1.xyz, -R0, R1.w, c[4].x;\n"
542 "RSQ R2.z, R2.z;\n"
543 "RSQ R2.y, R2.y;\n"
544 "RCP R2.x, R2.w;\n"
545 "RCP R2.z, R2.z;\n"
546 "RCP R2.y, R2.y;\n"
547 "MAD R5.xyz, R2, R0.w, -R0;\n"
548 "MAD R2.xyz, fragment.color.primary, c[4].z, -fragment.color.primary.w;\n"
549 "MUL R3.xyz, R1, R2;\n"
550 "MAD R3.xyz, -R3, R4, fragment.color.primary.w;\n"
551 "MUL R4.xyz, R5, R2;\n"
552 "MAD R1.xyz, -R1, R2, fragment.color.primary.w;\n"
553 "MAD R5.xyz, R0, fragment.color.primary.w, R4;\n"
554 "MUL R3.xyz, R0, R3;\n"
555 "MUL R4.xyz, R0, c[4].w;\n"
556 "ADD R5.xyz, R5, -R3;\n"
557 "SGE R4.xyz, R4, R0.w;\n"
558 "MUL R4.xyz, R4, R5;\n"
559 "ADD R2.xyz, R3, R4;\n"
560 "MUL R1.xyz, R0, R1;\n"
561 "MUL R3.xyz, fragment.color.primary, c[4].z;\n"
562 "ADD R2.xyz, R2, -R1;\n"
563 "SGE R3.xyz, R3, fragment.color.primary.w;\n"
564 "MUL R2.xyz, R3, R2;\n"
565 "ADD R1.xyz, R1, R2;\n"
566 "ADD R1.w, -R0, c[4].x;\n"
567 "MAD R1.xyz, fragment.color.primary, R1.w, R1;\n"
568 "ADD R1.w, -fragment.color.primary, c[4].x;\n"
569 "MAD R2.xyz, R0, R1.w, R1;\n"
570 "ADD R1.z, fragment.color.primary.w, R0.w;\n"
571 "MAD R2.w, -fragment.color.primary, R0, R1.z;\n"
572 "ADD R1.xy, fragment.position, c[0];\n"
573 "MUL R1.xy, R1, c[1];\n"
574 "TEX R1, R1, texture[1], 2D;\n"
575 "ADD R2, R2, -R0;\n"
576 "DP4 R1.x, R1, c[2];\n"
577 "MAD result.color, R1.x, R2, R0;\n"
578 "END\n"
579 ;
580
581static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_SOLID_COMPOSITION_MODES_DIFFERENCE =
582 "!!ARBfp1.0\n"
583 "PARAM c[5] = { program.local[0..3],\n"
584 " { 2 } };\n"
585 "TEMP R0;\n"
586 "TEMP R1;\n"
587 "TEMP R2;\n"
588 "TEMP R3;\n"
589 "MUL R0.xy, fragment.position, c[3];\n"
590 "TEX R1, R0, texture[0], 2D;\n"
591 "MUL R2.xyz, R1, fragment.color.primary.w;\n"
592 "MUL R0.xyz, fragment.color.primary, R1.w;\n"
593 "MIN R0.xyz, R0, R2;\n"
594 "ADD R3.xyz, fragment.color.primary, R1;\n"
595 "MAD R2.xyz, -R0, c[4].x, R3;\n"
596 "ADD R0.z, fragment.color.primary.w, R1.w;\n"
597 "MAD R2.w, -fragment.color.primary, R1, R0.z;\n"
598 "ADD R0.xy, fragment.position, c[0];\n"
599 "MUL R0.xy, R0, c[1];\n"
600 "TEX R0, R0, texture[1], 2D;\n"
601 "ADD R2, R2, -R1;\n"
602 "DP4 R0.x, R0, c[2];\n"
603 "MAD result.color, R0.x, R2, R1;\n"
604 "END\n"
605 ;
606
607static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_SOLID_COMPOSITION_MODES_EXCLUSION =
608 "!!ARBfp1.0\n"
609 "PARAM c[5] = { program.local[0..3],\n"
610 " { 1, 2 } };\n"
611 "TEMP R0;\n"
612 "TEMP R1;\n"
613 "TEMP R2;\n"
614 "MUL R0.xy, fragment.position, c[3];\n"
615 "TEX R1, R0, texture[0], 2D;\n"
616 "MUL R0.xyz, R1, fragment.color.primary.w;\n"
617 "MAD R2.xyz, fragment.color.primary, R1.w, R0;\n"
618 "MUL R0.xyz, fragment.color.primary, R1;\n"
619 "MAD R0.xyz, -R0, c[4].y, R2;\n"
620 "ADD R0.w, -R1, c[4].x;\n"
621 "MAD R0.xyz, fragment.color.primary, R0.w, R0;\n"
622 "ADD R0.w, -fragment.color.primary, c[4].x;\n"
623 "MAD R2.xyz, R1, R0.w, R0;\n"
624 "ADD R0.z, fragment.color.primary.w, R1.w;\n"
625 "MAD R2.w, -fragment.color.primary, R1, R0.z;\n"
626 "ADD R0.xy, fragment.position, c[0];\n"
627 "MUL R0.xy, R0, c[1];\n"
628 "TEX R0, R0, texture[1], 2D;\n"
629 "ADD R2, R2, -R1;\n"
630 "DP4 R0.x, R0, c[2];\n"
631 "MAD result.color, R0.x, R2, R1;\n"
632 "END\n"
633 ;
634
635static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_SOLID_COMPOSITION_MODES_SIMPLE_PORTER_DUFF_NOMASK =
636 "!!ARBfp1.0\n"
637 "PARAM c[4] = { program.local[0],\n"
638 " { 1 },\n"
639 " program.local[2..3] };\n"
640 "TEMP R0;\n"
641 "TEMP R1;\n"
642 "TEMP R2;\n"
643 "MUL R0.xy, fragment.position, c[0];\n"
644 "TEX R0, R0, texture[0], 2D;\n"
645 "MUL R1.xyz, R0, c[3].y;\n"
646 "MUL R2.xyz, R1, fragment.color.primary.w;\n"
647 "MUL R1.xyz, fragment.color.primary, c[3].x;\n"
648 "MAD R2.xyz, R1, R0.w, R2;\n"
649 "MUL R0.xyz, R0, c[2].z;\n"
650 "ADD R1.w, -R0, c[1].x;\n"
651 "MUL R1.xyz, fragment.color.primary, c[2].y;\n"
652 "MAD R1.xyz, R1, R1.w, R2;\n"
653 "ADD R1.w, -fragment.color.primary, c[1].x;\n"
654 "MAD result.color.xyz, R0, R1.w, R1;\n"
655 "ADD R0.y, -R0.w, c[1].x;\n"
656 "MUL R0.x, fragment.color.primary.w, R0.w;\n"
657 "MUL R0.z, R0.w, R1.w;\n"
658 "MUL R0.y, fragment.color.primary.w, R0;\n"
659 "DP3 result.color.w, R0, c[2];\n"
660 "END\n"
661 ;
662
663static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_SOLID_COMPOSITION_MODES_MULTIPLY_NOMASK =
664 "!!ARBfp1.0\n"
665 "PARAM c[2] = { program.local[0],\n"
666 " { 1 } };\n"
667 "TEMP R0;\n"
668 "TEMP R1;\n"
669 "TEMP R2;\n"
670 "MUL R0.xy, fragment.position, c[0];\n"
671 "TEX R0, R0, texture[0], 2D;\n"
672 "ADD R1.x, -R0.w, c[1];\n"
673 "MUL R1.xyz, fragment.color.primary, R1.x;\n"
674 "ADD R1.w, fragment.color.primary, R0;\n"
675 "MAD R1.xyz, fragment.color.primary, R0, R1;\n"
676 "ADD R2.x, -fragment.color.primary.w, c[1];\n"
677 "MAD result.color.xyz, R0, R2.x, R1;\n"
678 "MAD result.color.w, -fragment.color.primary, R0, R1;\n"
679 "END\n"
680 ;
681
682static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_SOLID_COMPOSITION_MODES_SCREEN_NOMASK =
683 "!!ARBfp1.0\n"
684 "PARAM c[1] = { program.local[0] };\n"
685 "TEMP R0;\n"
686 "TEMP R1;\n"
687 "MUL R0.xy, fragment.position, c[0];\n"
688 "TEX R0, R0, texture[0], 2D;\n"
689 "ADD R1, fragment.color.primary, R0;\n"
690 "MAD result.color, -fragment.color.primary, R0, R1;\n"
691 "END\n"
692 ;
693
694static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_SOLID_COMPOSITION_MODES_OVERLAY_NOMASK =
695 "!!ARBfp1.0\n"
696 "PARAM c[2] = { program.local[0],\n"
697 " { 2, 1 } };\n"
698 "TEMP R0;\n"
699 "TEMP R1;\n"
700 "TEMP R2;\n"
701 "TEMP R3;\n"
702 "MUL R0.xy, fragment.position, c[0];\n"
703 "TEX R0, R0, texture[0], 2D;\n"
704 "ADD R1.w, -R0, c[1].y;\n"
705 "ADD R2.xyz, fragment.color.primary.w, -fragment.color.primary;\n"
706 "ADD R1.xyz, R0.w, -R0;\n"
707 "MUL R1.xyz, R1, R2;\n"
708 "MUL R1.xyz, R1, c[1].x;\n"
709 "MAD R1.xyz, fragment.color.primary.w, R0.w, -R1;\n"
710 "MUL R3.xyz, fragment.color.primary, R1.w;\n"
711 "MUL R2.xyz, fragment.color.primary, R0;\n"
712 "MAD R1.xyz, fragment.color.primary, R1.w, R1;\n"
713 "ADD R1.w, -fragment.color.primary, c[1].y;\n"
714 "MAD R2.xyz, R2, c[1].x, R3;\n"
715 "MAD R2.xyz, R0, R1.w, R2;\n"
716 "MAD R1.xyz, R0, R1.w, R1;\n"
717 "MUL R0.xyz, R0, c[1].x;\n"
718 "ADD R1.w, fragment.color.primary, R0;\n"
719 "ADD R1.xyz, R1, -R2;\n"
720 "SGE R0.xyz, R0, R0.w;\n"
721 "MAD result.color.xyz, R0, R1, R2;\n"
722 "MAD result.color.w, -fragment.color.primary, R0, R1;\n"
723 "END\n"
724 ;
725
726static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_SOLID_COMPOSITION_MODES_DARKEN_NOMASK =
727 "!!ARBfp1.0\n"
728 "PARAM c[2] = { program.local[0],\n"
729 " { 1 } };\n"
730 "TEMP R0;\n"
731 "TEMP R1;\n"
732 "TEMP R2;\n"
733 "MUL R0.xy, fragment.position, c[0];\n"
734 "TEX R0, R0, texture[0], 2D;\n"
735 "MUL R2.xyz, R0, fragment.color.primary.w;\n"
736 "MUL R1.xyz, fragment.color.primary, R0.w;\n"
737 "MIN R1.xyz, R1, R2;\n"
738 "ADD R1.w, -R0, c[1].x;\n"
739 "MAD R1.xyz, fragment.color.primary, R1.w, R1;\n"
740 "ADD R1.w, fragment.color.primary, R0;\n"
741 "ADD R2.x, -fragment.color.primary.w, c[1];\n"
742 "MAD result.color.xyz, R0, R2.x, R1;\n"
743 "MAD result.color.w, -fragment.color.primary, R0, R1;\n"
744 "END\n"
745 ;
746
747static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_SOLID_COMPOSITION_MODES_LIGHTEN_NOMASK =
748 "!!ARBfp1.0\n"
749 "PARAM c[2] = { program.local[0],\n"
750 " { 1 } };\n"
751 "TEMP R0;\n"
752 "TEMP R1;\n"
753 "TEMP R2;\n"
754 "MUL R0.xy, fragment.position, c[0];\n"
755 "TEX R0, R0, texture[0], 2D;\n"
756 "MUL R2.xyz, R0, fragment.color.primary.w;\n"
757 "MUL R1.xyz, fragment.color.primary, R0.w;\n"
758 "MAX R1.xyz, R1, R2;\n"
759 "ADD R1.w, -R0, c[1].x;\n"
760 "MAD R1.xyz, fragment.color.primary, R1.w, R1;\n"
761 "ADD R1.w, fragment.color.primary, R0;\n"
762 "ADD R2.x, -fragment.color.primary.w, c[1];\n"
763 "MAD result.color.xyz, R0, R2.x, R1;\n"
764 "MAD result.color.w, -fragment.color.primary, R0, R1;\n"
765 "END\n"
766 ;
767
768static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_SOLID_COMPOSITION_MODES_COLORDODGE_NOMASK =
769 "!!ARBfp1.0\n"
770 "PARAM c[2] = { program.local[0],\n"
771 " { 1, 1e-06 } };\n"
772 "TEMP R0;\n"
773 "TEMP R1;\n"
774 "TEMP R2;\n"
775 "MAX R1.y, fragment.color.primary.w, c[1];\n"
776 "RCP R2.x, R1.y;\n"
777 "MUL R0.xy, fragment.position, c[0];\n"
778 "TEX R0, R0, texture[0], 2D;\n"
779 "ADD R1.x, -fragment.color.primary.w, c[1];\n"
780 "MUL R1.xyz, R0, R1.x;\n"
781 "ADD R1.w, -R0, c[1].x;\n"
782 "MAD R1.xyz, fragment.color.primary, R1.w, R1;\n"
783 "MAD R2.xyz, -fragment.color.primary, R2.x, c[1].x;\n"
784 "MAX R2.xyz, R2, c[1].y;\n"
785 "MUL R0.xyz, R0, fragment.color.primary.w;\n"
786 "MUL R1.w, fragment.color.primary, R0;\n"
787 "RCP R2.x, R2.x;\n"
788 "RCP R2.y, R2.y;\n"
789 "RCP R2.z, R2.z;\n"
790 "MAD R2.xyz, R0, R2, R1;\n"
791 "MAD R1.xyz, fragment.color.primary.w, R0.w, R1;\n"
792 "MAD R0.xyz, fragment.color.primary, R0.w, R0;\n"
793 "SGE R0.xyz, R0, R1.w;\n"
794 "ADD R1.xyz, R1, -R2;\n"
795 "ADD R1.w, fragment.color.primary, R0;\n"
796 "MAD result.color.xyz, R0, R1, R2;\n"
797 "MAD result.color.w, -fragment.color.primary, R0, R1;\n"
798 "END\n"
799 ;
800
801static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_SOLID_COMPOSITION_MODES_COLORBURN_NOMASK =
802 "!!ARBfp1.0\n"
803 "PARAM c[2] = { program.local[0],\n"
804 " { 1, 9.9999997e-06 } };\n"
805 "TEMP R0;\n"
806 "TEMP R1;\n"
807 "TEMP R2;\n"
808 "TEMP R3;\n"
809 "TEMP R4;\n"
810 "MUL R0.xy, fragment.position, c[0];\n"
811 "TEX R0, R0, texture[0], 2D;\n"
812 "MUL R1.xyz, R0, fragment.color.primary.w;\n"
813 "MAD R2.xyz, fragment.color.primary, R0.w, R1;\n"
814 "MAD R1.xyz, -fragment.color.primary.w, R0.w, R2;\n"
815 "MUL R3.xyz, fragment.color.primary.w, R1;\n"
816 "MAX R1.xyz, fragment.color.primary, c[1].y;\n"
817 "ADD R1.w, -R0, c[1].x;\n"
818 "MUL R4.xyz, fragment.color.primary, R1.w;\n"
819 "ADD R2.w, -fragment.color.primary, c[1].x;\n"
820 "RCP R1.x, R1.x;\n"
821 "RCP R1.y, R1.y;\n"
822 "RCP R1.z, R1.z;\n"
823 "MAD R1.xyz, R3, R1, R4;\n"
824 "MUL R3.xyz, R0, R2.w;\n"
825 "ADD R2.w, -fragment.color.primary, c[1].x;\n"
826 "MAD R0.xyz, R0, R2.w, R1;\n"
827 "MAD R1.xyz, fragment.color.primary, R1.w, R3;\n"
828 "MUL R1.w, fragment.color.primary, R0;\n"
829 "SGE R2.xyz, R2, R1.w;\n"
830 "ADD R0.xyz, R0, -R1;\n"
831 "ADD R1.w, fragment.color.primary, R0;\n"
832 "MAD result.color.xyz, R2, R0, R1;\n"
833 "MAD result.color.w, -fragment.color.primary, R0, R1;\n"
834 "END\n"
835 ;
836
837static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_SOLID_COMPOSITION_MODES_HARDLIGHT_NOMASK =
838 "!!ARBfp1.0\n"
839 "PARAM c[2] = { program.local[0],\n"
840 " { 2, 1 } };\n"
841 "TEMP R0;\n"
842 "TEMP R1;\n"
843 "TEMP R2;\n"
844 "TEMP R3;\n"
845 "MUL R0.xy, fragment.position, c[0];\n"
846 "TEX R0, R0, texture[0], 2D;\n"
847 "ADD R1.w, -R0, c[1].y;\n"
848 "ADD R2.xyz, fragment.color.primary.w, -fragment.color.primary;\n"
849 "ADD R1.xyz, R0.w, -R0;\n"
850 "MUL R1.xyz, R1, R2;\n"
851 "MUL R1.xyz, R1, c[1].x;\n"
852 "MAD R1.xyz, fragment.color.primary.w, R0.w, -R1;\n"
853 "MAD R1.xyz, fragment.color.primary, R1.w, R1;\n"
854 "MUL R3.xyz, fragment.color.primary, R1.w;\n"
855 "MUL R2.xyz, fragment.color.primary, R0;\n"
856 "ADD R1.w, -fragment.color.primary, c[1].y;\n"
857 "MAD R2.xyz, R2, c[1].x, R3;\n"
858 "MAD R2.xyz, R0, R1.w, R2;\n"
859 "MAD R0.xyz, R0, R1.w, R1;\n"
860 "ADD R1.xyz, R0, -R2;\n"
861 "MUL R0.xyz, fragment.color.primary, c[1].x;\n"
862 "ADD R1.w, fragment.color.primary, R0;\n"
863 "SGE R0.xyz, R0, fragment.color.primary.w;\n"
864 "MAD result.color.xyz, R0, R1, R2;\n"
865 "MAD result.color.w, -fragment.color.primary, R0, R1;\n"
866 "END\n"
867 ;
868
869static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_SOLID_COMPOSITION_MODES_SOFTLIGHT_NOMASK =
870 "!!ARBfp1.0\n"
871 "PARAM c[3] = { program.local[0],\n"
872 " { 1, 9.9999997e-06, 2, 8 },\n"
873 " { 3 } };\n"
874 "TEMP R0;\n"
875 "TEMP R1;\n"
876 "TEMP R2;\n"
877 "TEMP R3;\n"
878 "TEMP R4;\n"
879 "TEMP R5;\n"
880 "MUL R0.xy, fragment.position, c[0];\n"
881 "TEX R0, R0, texture[0], 2D;\n"
882 "MAX R1.x, R0.w, c[1].y;\n"
883 "RCP R1.w, R1.x;\n"
884 "MUL R2.xyz, R0, R1.w;\n"
885 "MUL R1.xyz, -R2, c[1].w;\n"
886 "ADD R4.xyz, R1, c[2].x;\n"
887 "MAD R1.xyz, -R0, R1.w, c[1].x;\n"
888 "RSQ R2.w, R2.x;\n"
889 "RSQ R2.z, R2.z;\n"
890 "RSQ R2.y, R2.y;\n"
891 "RCP R2.x, R2.w;\n"
892 "RCP R2.z, R2.z;\n"
893 "RCP R2.y, R2.y;\n"
894 "MAD R5.xyz, R2, R0.w, -R0;\n"
895 "MAD R2.xyz, fragment.color.primary, c[1].z, -fragment.color.primary.w;\n"
896 "MUL R3.xyz, R1, R2;\n"
897 "MAD R3.xyz, -R3, R4, fragment.color.primary.w;\n"
898 "MUL R4.xyz, R5, R2;\n"
899 "MAD R1.xyz, -R1, R2, fragment.color.primary.w;\n"
900 "MAD R5.xyz, R0, fragment.color.primary.w, R4;\n"
901 "MUL R3.xyz, R0, R3;\n"
902 "MUL R4.xyz, R0, c[1].w;\n"
903 "ADD R5.xyz, R5, -R3;\n"
904 "SGE R4.xyz, R4, R0.w;\n"
905 "MUL R4.xyz, R4, R5;\n"
906 "ADD R2.xyz, R3, R4;\n"
907 "MUL R1.xyz, R0, R1;\n"
908 "MUL R3.xyz, fragment.color.primary, c[1].z;\n"
909 "ADD R2.xyz, R2, -R1;\n"
910 "SGE R3.xyz, R3, fragment.color.primary.w;\n"
911 "MUL R2.xyz, R3, R2;\n"
912 "ADD R1.xyz, R1, R2;\n"
913 "ADD R1.w, -R0, c[1].x;\n"
914 "MAD R1.xyz, fragment.color.primary, R1.w, R1;\n"
915 "ADD R1.w, fragment.color.primary, R0;\n"
916 "ADD R2.x, -fragment.color.primary.w, c[1];\n"
917 "MAD result.color.xyz, R0, R2.x, R1;\n"
918 "MAD result.color.w, -fragment.color.primary, R0, R1;\n"
919 "END\n"
920 ;
921
922static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_SOLID_COMPOSITION_MODES_DIFFERENCE_NOMASK =
923 "!!ARBfp1.0\n"
924 "PARAM c[2] = { program.local[0],\n"
925 " { 2 } };\n"
926 "TEMP R0;\n"
927 "TEMP R1;\n"
928 "TEMP R2;\n"
929 "MUL R0.xy, fragment.position, c[0];\n"
930 "TEX R0, R0, texture[0], 2D;\n"
931 "MUL R2.xyz, R0, fragment.color.primary.w;\n"
932 "MUL R1.xyz, fragment.color.primary, R0.w;\n"
933 "ADD R1.w, fragment.color.primary, R0;\n"
934 "MIN R1.xyz, R1, R2;\n"
935 "ADD R0.xyz, fragment.color.primary, R0;\n"
936 "MAD result.color.xyz, -R1, c[1].x, R0;\n"
937 "MAD result.color.w, -fragment.color.primary, R0, R1;\n"
938 "END\n"
939 ;
940
941static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_SOLID_COMPOSITION_MODES_EXCLUSION_NOMASK =
942 "!!ARBfp1.0\n"
943 "PARAM c[2] = { program.local[0],\n"
944 " { 1, 2 } };\n"
945 "TEMP R0;\n"
946 "TEMP R1;\n"
947 "TEMP R2;\n"
948 "MUL R0.xy, fragment.position, c[0];\n"
949 "TEX R0, R0, texture[0], 2D;\n"
950 "MUL R1.xyz, R0, fragment.color.primary.w;\n"
951 "MAD R2.xyz, fragment.color.primary, R0.w, R1;\n"
952 "MUL R1.xyz, fragment.color.primary, R0;\n"
953 "MAD R1.xyz, -R1, c[1].y, R2;\n"
954 "ADD R1.w, -R0, c[1].x;\n"
955 "MAD R1.xyz, fragment.color.primary, R1.w, R1;\n"
956 "ADD R1.w, fragment.color.primary, R0;\n"
957 "ADD R2.x, -fragment.color.primary.w, c[1];\n"
958 "MAD result.color.xyz, R0, R2.x, R1;\n"
959 "MAD result.color.w, -fragment.color.primary, R0, R1;\n"
960 "END\n"
961 ;
962
963static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_SOLID_COMPOSITION_MODE_BLEND_MODE_MASK =
964 "!!ARBfp1.0\n"
965 "PARAM c[3] = { program.local[0..2] };\n"
966 "TEMP R0;\n"
967 "ADD R0.xy, fragment.position, c[0];\n"
968 "MUL R0.xy, R0, c[1];\n"
969 "TEX R0, R0, texture[0], 2D;\n"
970 "DP4 R0.x, R0, c[2];\n"
971 "MUL result.color, fragment.color.primary, R0.x;\n"
972 "END\n"
973 ;
974
975static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_SOLID_COMPOSITION_MODE_BLEND_MODE_NOMASK =
976 "!!ARBfp1.0\n"
977 "PARAM c[1] = { program.local[0] };\n"
978 "MOV result.color, fragment.color.primary;\n"
979 "END\n"
980 ;
981
982static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_RADIAL_COMPOSITION_MODES_SIMPLE_PORTER_DUFF =
983 "!!ARBfp1.0\n"
984 "PARAM c[12] = { program.local[0..6],\n"
985 " { 2, 4, 1 },\n"
986 " program.local[8..11] };\n"
987 "TEMP R0;\n"
988 "TEMP R1;\n"
989 "TEMP R2;\n"
990 "TEMP R3;\n"
991 "MUL R0.xyz, fragment.position.y, c[4];\n"
992 "MAD R0.xyz, fragment.position.x, c[3], R0;\n"
993 "ADD R0.xyz, R0, c[5];\n"
994 "RCP R0.z, R0.z;\n"
995 "MUL R0.xy, R0, R0.z;\n"
996 "MUL R0.zw, R0.xyxy, R0.xyxy;\n"
997 "ADD R0.z, R0, R0.w;\n"
998 "MUL R0.xy, R0, c[6];\n"
999 "ADD R0.x, R0, R0.y;\n"
1000 "MUL R0.z, c[8].x, -R0;\n"
1001 "MUL R0.y, R0.z, c[7];\n"
1002 "MUL R0.x, R0, c[7];\n"
1003 "MAD R0.y, R0.x, R0.x, -R0;\n"
1004 "RSQ R0.z, R0.y;\n"
1005 "RCP R0.z, R0.z;\n"
1006 "ADD R0.x, -R0, R0.z;\n"
1007 "MUL R0.zw, fragment.position.xyxy, c[9].xyxy;\n"
1008 "TEX R1, R0.zwzw, texture[0], 2D;\n"
1009 "MOV R0.y, c[7].x;\n"
1010 "MUL R0.y, c[8].x, R0;\n"
1011 "RCP R0.y, R0.y;\n"
1012 "MUL R0.x, R0, R0.y;\n"
1013 "TEX R0, R0, texture[2], 1D;\n"
1014 "MUL R2.xyz, R1, c[11].y;\n"
1015 "MUL R3.xyz, R2, R0.w;\n"
1016 "MUL R2.xyz, R0, c[11].x;\n"
1017 "MAD R2.xyz, R2, R1.w, R3;\n"
1018 "ADD R3.xy, fragment.position, c[0];\n"
1019 "ADD R2.w, -R1, c[7].z;\n"
1020 "MUL R0.xyz, R0, c[10].y;\n"
1021 "MAD R2.xyz, R0, R2.w, R2;\n"
1022 "MUL R0.xyz, R1, c[10].z;\n"
1023 "ADD R3.z, -R0.w, c[7];\n"
1024 "MAD R2.xyz, R0, R3.z, R2;\n"
1025 "MUL R0.y, R0.w, R2.w;\n"
1026 "MUL R0.x, R0.w, R1.w;\n"
1027 "MUL R0.z, R1.w, R3;\n"
1028 "DP3 R2.w, R0, c[10];\n"
1029 "MUL R3.xy, R3, c[1];\n"
1030 "TEX R0, R3, texture[1], 2D;\n"
1031 "ADD R2, R2, -R1;\n"
1032 "DP4 R0.x, R0, c[2];\n"
1033 "MAD result.color, R0.x, R2, R1;\n"
1034 "END\n"
1035 ;
1036
1037static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_RADIAL_COMPOSITION_MODES_MULTIPLY =
1038 "!!ARBfp1.0\n"
1039 "PARAM c[10] = { program.local[0..6],\n"
1040 " { 2, 4, 1 },\n"
1041 " program.local[8..9] };\n"
1042 "TEMP R0;\n"
1043 "TEMP R1;\n"
1044 "TEMP R2;\n"
1045 "MUL R0.xyz, fragment.position.y, c[4];\n"
1046 "MAD R0.xyz, fragment.position.x, c[3], R0;\n"
1047 "ADD R0.xyz, R0, c[5];\n"
1048 "RCP R0.z, R0.z;\n"
1049 "MUL R0.xy, R0, R0.z;\n"
1050 "MUL R0.zw, R0.xyxy, R0.xyxy;\n"
1051 "MUL R0.xy, R0, c[6];\n"
1052 "ADD R0.z, R0, R0.w;\n"
1053 "ADD R0.x, R0, R0.y;\n"
1054 "MUL R0.z, c[8].x, -R0;\n"
1055 "MUL R0.y, R0.z, c[7];\n"
1056 "MUL R0.x, R0, c[7];\n"
1057 "MAD R0.y, R0.x, R0.x, -R0;\n"
1058 "RSQ R0.y, R0.y;\n"
1059 "RCP R0.z, R0.y;\n"
1060 "ADD R0.x, -R0, R0.z;\n"
1061 "MUL R0.zw, fragment.position.xyxy, c[9].xyxy;\n"
1062 "TEX R1, R0.zwzw, texture[0], 2D;\n"
1063 "MOV R0.y, c[7].x;\n"
1064 "MUL R0.y, c[8].x, R0;\n"
1065 "RCP R0.y, R0.y;\n"
1066 "MUL R0.x, R0, R0.y;\n"
1067 "TEX R0, R0, texture[2], 1D;\n"
1068 "ADD R2.x, -R1.w, c[7].z;\n"
1069 "MUL R2.xyz, R0, R2.x;\n"
1070 "MAD R0.xyz, R0, R1, R2;\n"
1071 "ADD R2.x, -R0.w, c[7].z;\n"
1072 "MAD R2.xyz, R1, R2.x, R0;\n"
1073 "ADD R0.z, R0.w, R1.w;\n"
1074 "MAD R2.w, -R0, R1, R0.z;\n"
1075 "ADD R0.xy, fragment.position, c[0];\n"
1076 "MUL R0.xy, R0, c[1];\n"
1077 "TEX R0, R0, texture[1], 2D;\n"
1078 "ADD R2, R2, -R1;\n"
1079 "DP4 R0.x, R0, c[2];\n"
1080 "MAD result.color, R0.x, R2, R1;\n"
1081 "END\n"
1082 ;
1083
1084static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_RADIAL_COMPOSITION_MODES_SCREEN =
1085 "!!ARBfp1.0\n"
1086 "PARAM c[10] = { program.local[0..6],\n"
1087 " { 2, 4 },\n"
1088 " program.local[8..9] };\n"
1089 "TEMP R0;\n"
1090 "TEMP R1;\n"
1091 "TEMP R2;\n"
1092 "TEMP R3;\n"
1093 "MUL R0.xyz, fragment.position.y, c[4];\n"
1094 "MAD R0.xyz, fragment.position.x, c[3], R0;\n"
1095 "ADD R0.xyz, R0, c[5];\n"
1096 "RCP R0.z, R0.z;\n"
1097 "MUL R0.xy, R0, R0.z;\n"
1098 "MUL R0.zw, R0.xyxy, R0.xyxy;\n"
1099 "MUL R0.xy, R0, c[6];\n"
1100 "ADD R0.z, R0, R0.w;\n"
1101 "ADD R0.x, R0, R0.y;\n"
1102 "MUL R0.z, c[8].x, -R0;\n"
1103 "MUL R0.y, R0.z, c[7];\n"
1104 "MUL R0.x, R0, c[7];\n"
1105 "MAD R0.y, R0.x, R0.x, -R0;\n"
1106 "MOV R0.z, c[7].x;\n"
1107 "RSQ R0.y, R0.y;\n"
1108 "RCP R0.y, R0.y;\n"
1109 "MUL R0.z, c[8].x, R0;\n"
1110 "MUL R1.xy, fragment.position, c[9];\n"
1111 "ADD R3.xy, fragment.position, c[0];\n"
1112 "TEX R1, R1, texture[0], 2D;\n"
1113 "ADD R0.x, -R0, R0.y;\n"
1114 "RCP R0.z, R0.z;\n"
1115 "MUL R0.x, R0, R0.z;\n"
1116 "TEX R0, R0, texture[2], 1D;\n"
1117 "ADD R2, R0, R1;\n"
1118 "MAD R2, -R0, R1, R2;\n"
1119 "MUL R3.xy, R3, c[1];\n"
1120 "TEX R0, R3, texture[1], 2D;\n"
1121 "ADD R2, R2, -R1;\n"
1122 "DP4 R0.x, R0, c[2];\n"
1123 "MAD result.color, R0.x, R2, R1;\n"
1124 "END\n"
1125 ;
1126
1127static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_RADIAL_COMPOSITION_MODES_OVERLAY =
1128 "!!ARBfp1.0\n"
1129 "PARAM c[10] = { program.local[0..6],\n"
1130 " { 2, 4, 1 },\n"
1131 " program.local[8..9] };\n"
1132 "TEMP R0;\n"
1133 "TEMP R1;\n"
1134 "TEMP R2;\n"
1135 "TEMP R3;\n"
1136 "TEMP R4;\n"
1137 "MUL R0.xyz, fragment.position.y, c[4];\n"
1138 "MAD R0.xyz, fragment.position.x, c[3], R0;\n"
1139 "ADD R0.xyz, R0, c[5];\n"
1140 "RCP R0.z, R0.z;\n"
1141 "MUL R0.xy, R0, R0.z;\n"
1142 "MUL R0.zw, R0.xyxy, R0.xyxy;\n"
1143 "MUL R0.xy, R0, c[6];\n"
1144 "ADD R0.z, R0, R0.w;\n"
1145 "ADD R0.x, R0, R0.y;\n"
1146 "MUL R0.z, c[8].x, -R0;\n"
1147 "MUL R0.y, R0.z, c[7];\n"
1148 "MUL R0.x, R0, c[7];\n"
1149 "MAD R0.y, R0.x, R0.x, -R0;\n"
1150 "MOV R0.z, c[7].x;\n"
1151 "RSQ R0.y, R0.y;\n"
1152 "RCP R0.y, R0.y;\n"
1153 "MUL R0.z, c[8].x, R0;\n"
1154 "MUL R1.xy, fragment.position, c[9];\n"
1155 "TEX R1, R1, texture[0], 2D;\n"
1156 "ADD R0.x, -R0, R0.y;\n"
1157 "RCP R0.z, R0.z;\n"
1158 "MUL R0.x, R0, R0.z;\n"
1159 "TEX R0, R0, texture[2], 1D;\n"
1160 "ADD R2.w, -R1, c[7].z;\n"
1161 "ADD R3.xyz, R0.w, -R0;\n"
1162 "ADD R2.xyz, R1.w, -R1;\n"
1163 "MUL R2.xyz, R2, R3;\n"
1164 "MUL R2.xyz, R2, c[7].x;\n"
1165 "MAD R2.xyz, R0.w, R1.w, -R2;\n"
1166 "MUL R4.xyz, R0, R2.w;\n"
1167 "MUL R3.xyz, R0, R1;\n"
1168 "MAD R0.xyz, R0, R2.w, R2;\n"
1169 "ADD R2.x, -R0.w, c[7].z;\n"
1170 "MAD R3.xyz, R3, c[7].x, R4;\n"
1171 "MAD R3.xyz, R1, R2.x, R3;\n"
1172 "MAD R0.xyz, R1, R2.x, R0;\n"
1173 "MUL R2.xyz, R1, c[7].x;\n"
1174 "ADD R0.xyz, R0, -R3;\n"
1175 "SGE R2.xyz, R2, R1.w;\n"
1176 "MAD R2.xyz, R2, R0, R3;\n"
1177 "ADD R0.z, R0.w, R1.w;\n"
1178 "MAD R2.w, -R0, R1, R0.z;\n"
1179 "ADD R0.xy, fragment.position, c[0];\n"
1180 "MUL R0.xy, R0, c[1];\n"
1181 "TEX R0, R0, texture[1], 2D;\n"
1182 "ADD R2, R2, -R1;\n"
1183 "DP4 R0.x, R0, c[2];\n"
1184 "MAD result.color, R0.x, R2, R1;\n"
1185 "END\n"
1186 ;
1187
1188static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_RADIAL_COMPOSITION_MODES_DARKEN =
1189 "!!ARBfp1.0\n"
1190 "PARAM c[10] = { program.local[0..6],\n"
1191 " { 2, 4, 1 },\n"
1192 " program.local[8..9] };\n"
1193 "TEMP R0;\n"
1194 "TEMP R1;\n"
1195 "TEMP R2;\n"
1196 "TEMP R3;\n"
1197 "MUL R0.xyz, fragment.position.y, c[4];\n"
1198 "MAD R0.xyz, fragment.position.x, c[3], R0;\n"
1199 "ADD R0.xyz, R0, c[5];\n"
1200 "RCP R0.z, R0.z;\n"
1201 "MUL R0.xy, R0, R0.z;\n"
1202 "MUL R0.zw, R0.xyxy, R0.xyxy;\n"
1203 "MUL R0.xy, R0, c[6];\n"
1204 "ADD R0.z, R0, R0.w;\n"
1205 "ADD R0.x, R0, R0.y;\n"
1206 "MUL R0.z, c[8].x, -R0;\n"
1207 "MUL R0.y, R0.z, c[7];\n"
1208 "MUL R0.x, R0, c[7];\n"
1209 "MAD R0.y, R0.x, R0.x, -R0;\n"
1210 "MOV R0.z, c[7].x;\n"
1211 "RSQ R0.y, R0.y;\n"
1212 "RCP R0.y, R0.y;\n"
1213 "MUL R0.z, c[8].x, R0;\n"
1214 "MUL R1.xy, fragment.position, c[9];\n"
1215 "TEX R1, R1, texture[0], 2D;\n"
1216 "ADD R0.x, -R0, R0.y;\n"
1217 "RCP R0.z, R0.z;\n"
1218 "MUL R0.x, R0, R0.z;\n"
1219 "TEX R0, R0, texture[2], 1D;\n"
1220 "MUL R3.xyz, R1, R0.w;\n"
1221 "MUL R2.xyz, R0, R1.w;\n"
1222 "MIN R2.xyz, R2, R3;\n"
1223 "ADD R2.w, -R1, c[7].z;\n"
1224 "MAD R0.xyz, R0, R2.w, R2;\n"
1225 "ADD R2.x, -R0.w, c[7].z;\n"
1226 "MAD R2.xyz, R1, R2.x, R0;\n"
1227 "ADD R0.z, R0.w, R1.w;\n"
1228 "MAD R2.w, -R0, R1, R0.z;\n"
1229 "ADD R0.xy, fragment.position, c[0];\n"
1230 "MUL R0.xy, R0, c[1];\n"
1231 "TEX R0, R0, texture[1], 2D;\n"
1232 "ADD R2, R2, -R1;\n"
1233 "DP4 R0.x, R0, c[2];\n"
1234 "MAD result.color, R0.x, R2, R1;\n"
1235 "END\n"
1236 ;
1237