1/*
2 * Copyright (C) 2012 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package android.renderscript;
18
19
20/**
21 * Intrinsic kernels for blending two {@link android.renderscript.Allocation} objects.
22 **/
23public class ScriptIntrinsicBlend extends ScriptIntrinsic {
24    ScriptIntrinsicBlend(long id, RenderScript rs) {
25        super(id, rs);
26    }
27
28    /**
29     * Supported elements types are {@link Element#U8_4}
30     *
31     * @param rs The RenderScript context
32     * @param e Element type for inputs and outputs
33     *
34     * @return ScriptIntrinsicBlend
35     */
36    public static ScriptIntrinsicBlend create(RenderScript rs, Element e) {
37        // 7 comes from RS_SCRIPT_INTRINSIC_ID_BLEND in rsDefines.h
38        long id = rs.nScriptIntrinsicCreate(7, e.getID(rs));
39        return new ScriptIntrinsicBlend(id, rs);
40
41    }
42
43    private void blend(int id, Allocation ain, Allocation aout, Script.LaunchOptions opt) {
44        if (!ain.getElement().isCompatible(Element.U8_4(mRS))) {
45            throw new RSIllegalArgumentException("Input is not of expected format.");
46        }
47        if (!aout.getElement().isCompatible(Element.U8_4(mRS))) {
48            throw new RSIllegalArgumentException("Output is not of expected format.");
49        }
50        forEach(id, ain, aout, null, opt);
51    }
52
53    /**
54     * Sets dst = {0, 0, 0, 0}
55     *
56     * @param ain The source buffer
57     * @param aout The destination buffer
58     */
59    public void forEachClear(Allocation ain, Allocation aout) {
60        forEachClear(ain, aout, null);
61    }
62
63    /**
64     * Sets dst = {0, 0, 0, 0}
65     *
66     * @param ain The source buffer
67     * @param aout The destination buffer
68     * @param opt LaunchOptions for clipping
69     */
70    public void forEachClear(Allocation ain, Allocation aout, Script.LaunchOptions opt) {
71        blend(0, ain, aout, opt);
72    }
73
74    /**
75     * Get a KernelID for the Clear kernel.
76     *
77     * @return Script.KernelID The KernelID object.
78     */
79    public Script.KernelID getKernelIDClear() {
80        return createKernelID(0, 3, null, null);
81    }
82
83
84    /**
85     * Sets dst = src
86     *
87     * @param ain The source buffer
88     * @param aout The destination buffer
89     */
90    public void forEachSrc(Allocation ain, Allocation aout) {
91        forEachSrc(ain, aout, null);
92    }
93
94    /**
95     * Sets dst = src
96     *
97     * @param ain The source buffer
98     * @param aout The destination buffer
99     * @param opt LaunchOptions for clipping
100     */
101    public void forEachSrc(Allocation ain, Allocation aout, Script.LaunchOptions opt) {
102        blend(1, ain, aout, null);
103    }
104
105    /**
106     * Get a KernelID for the Src kernel.
107     *
108     * @return Script.KernelID The KernelID object.
109     */
110    public Script.KernelID getKernelIDSrc() {
111        return createKernelID(1, 3, null, null);
112    }
113
114    /**
115     * Sets dst = dst
116     *
117     * This is a NOP.
118     *
119     * @param ain The source buffer
120     * @param aout The destination buffer
121     */
122    public void forEachDst(Allocation ain, Allocation aout) {
123        // NOP
124    }
125
126    /**
127     * Sets dst = dst
128     *
129     * This is a NOP.
130     *
131     * @param ain The source buffer
132     * @param aout The destination buffer
133     * @param opt LaunchOptions for clipping
134     */
135    public void forEachDst(Allocation ain, Allocation aout, Script.LaunchOptions opt) {
136        // N, optOP
137    }
138
139    /**
140     * Get a KernelID for the Dst kernel.
141     *
142     * @return Script.KernelID The KernelID object.
143     */
144    public Script.KernelID getKernelIDDst() {
145        return createKernelID(2, 3, null, null);
146    }
147
148    /**
149     * Sets dst = src + dst * (1.0 - src.a)
150     *
151     * @param ain The source buffer
152     * @param aout The destination buffer
153     */
154    public void forEachSrcOver(Allocation ain, Allocation aout) {
155        forEachSrcOver(ain, aout, null);
156    }
157
158    /**
159     * Sets dst = src + dst * (1.0 - src.a)
160     *
161     * @param ain The source buffer
162     * @param aout The destination buffer
163     * @param opt LaunchOptions for clipping
164     */
165    public void forEachSrcOver(Allocation ain, Allocation aout, Script.LaunchOptions opt) {
166        blend(3, ain, aout, opt);
167    }
168
169    /**
170     * Get a KernelID for the SrcOver kernel.
171     *
172     * @return Script.KernelID The KernelID object.
173     */
174    public Script.KernelID getKernelIDSrcOver() {
175        return createKernelID(3, 3, null, null);
176    }
177
178    /**
179     * Sets dst = dst + src * (1.0 - dst.a)
180     *
181     * @param ain The source buffer
182     * @param aout The destination buffer
183     */
184    public void forEachDstOver(Allocation ain, Allocation aout) {
185        forEachDstOver(ain, aout, null);
186    }
187
188    /**
189     * Sets dst = dst + src * (1.0 - dst.a)
190     *
191     * @param ain The source buffer
192     * @param aout The destination buffer
193     * @param opt LaunchOptions for clipping
194     */
195    public void forEachDstOver(Allocation ain, Allocation aout, Script.LaunchOptions opt) {
196        blend(4, ain, aout, opt);
197    }
198
199    /**
200     * Get a KernelID for the DstOver kernel.
201     *
202     * @return Script.KernelID The KernelID object.
203     */
204    public Script.KernelID getKernelIDDstOver() {
205        return createKernelID(4, 3, null, null);
206    }
207
208    /**
209     * Sets dst = src * dst.a
210     *
211     * @param ain The source buffer
212     * @param aout The destination buffer
213     */
214    public void forEachSrcIn(Allocation ain, Allocation aout) {
215        forEachSrcIn(ain, aout, null);
216    }
217
218    /**
219     * Sets dst = src * dst.a
220     *
221     * @param ain The source buffer
222     * @param aout The destination buffer
223     * @param opt LaunchOptions for clipping
224     */
225    public void forEachSrcIn(Allocation ain, Allocation aout, Script.LaunchOptions opt) {
226        blend(5, ain, aout, opt);
227    }
228
229    /**
230     * Get a KernelID for the SrcIn kernel.
231     *
232     * @return Script.KernelID The KernelID object.
233     */
234    public Script.KernelID getKernelIDSrcIn() {
235        return createKernelID(5, 3, null, null);
236    }
237
238    /**
239     * Sets dst = dst * src.a
240     *
241     * @param ain The source buffer
242     * @param aout The destination buffer
243     */
244    public void forEachDstIn(Allocation ain, Allocation aout) {
245        forEachDstIn(ain, aout, null);
246    }
247
248    /**
249     * Sets dst = dst * src.a
250     *
251     * @param ain The source buffer
252     * @param aout The destination buffer
253     * @param opt LaunchOptions for clipping
254     */
255    public void forEachDstIn(Allocation ain, Allocation aout, Script.LaunchOptions opt) {
256        blend(6, ain, aout, opt);
257    }
258
259    /**
260     * Get a KernelID for the DstIn kernel.
261     *
262     * @return Script.KernelID The KernelID object.
263     */
264    public Script.KernelID getKernelIDDstIn() {
265        return createKernelID(6, 3, null, null);
266    }
267
268    /**
269     * Sets dst = src * (1.0 - dst.a)
270     *
271     * @param ain The source buffer
272     * @param aout The destination buffer
273     */
274    public void forEachSrcOut(Allocation ain, Allocation aout) {
275        forEachSrcOut(ain, aout, null);
276    }
277
278    /**
279     * Sets dst = src * (1.0 - dst.a)
280     *
281     * @param ain The source buffer
282     * @param aout The destination buffer
283     * @param opt LaunchOptions for clipping
284     */
285    public void forEachSrcOut(Allocation ain, Allocation aout, Script.LaunchOptions opt) {
286        blend(7, ain, aout, opt);
287    }
288
289    /**
290     * Get a KernelID for the SrcOut kernel.
291     *
292     * @return Script.KernelID The KernelID object.
293     */
294    public Script.KernelID getKernelIDSrcOut() {
295        return createKernelID(7, 3, null, null);
296    }
297
298    /**
299     * Sets dst = dst * (1.0 - src.a)
300     *
301     * @param ain The source buffer
302     * @param aout The destination buffer
303     */
304    public void forEachDstOut(Allocation ain, Allocation aout) {
305        forEachDstOut(ain, aout, null);
306    }
307
308    /**
309     * Sets dst = dst * (1.0 - src.a)
310     *
311     * @param ain The source buffer
312     * @param aout The destination buffer
313     * @param opt LaunchOptions for clipping
314     */
315    public void forEachDstOut(Allocation ain, Allocation aout, Script.LaunchOptions opt) {
316        blend(8, ain, aout, opt);
317    }
318
319    /**
320     * Get a KernelID for the DstOut kernel.
321     *
322     * @return Script.KernelID The KernelID object.
323     */
324    public Script.KernelID getKernelIDDstOut() {
325        return createKernelID(8, 3, null, null);
326    }
327
328    /**
329     * dst.rgb = src.rgb * dst.a + (1.0 - src.a) * dst.rgb
330     * dst.a = dst.a
331     *
332     * @param ain The source buffer
333     * @param aout The destination buffer
334     */
335    public void forEachSrcAtop(Allocation ain, Allocation aout) {
336        forEachSrcAtop(ain, aout, null);
337    }
338
339    /**
340     * dst.rgb = src.rgb * dst.a + (1.0 - src.a) * dst.rgb
341     * dst.a = dst.a
342     *
343     * @param ain The source buffer
344     * @param aout The destination buffer
345     * @param opt LaunchOptions for clipping
346     */
347    public void forEachSrcAtop(Allocation ain, Allocation aout, Script.LaunchOptions opt) {
348        blend(9, ain, aout, opt);
349    }
350
351    /**
352     * Get a KernelID for the SrcAtop kernel.
353     *
354     * @return Script.KernelID The KernelID object.
355     */
356    public Script.KernelID getKernelIDSrcAtop() {
357        return createKernelID(9, 3, null, null);
358    }
359
360    /**
361     * dst = dst.rgb * src.a + (1.0 - dst.a) * src.rgb
362     * dst.a = src.a
363     * Note: Before API 23, the alpha channel was not correctly set.
364     *       Please use with caution when targeting older APIs.
365     *
366     * @param ain The source buffer
367     * @param aout The destination buffer
368     */
369    public void forEachDstAtop(Allocation ain, Allocation aout) {
370        forEachDstAtop(ain, aout, null);
371    }
372
373    /**
374     * dst = dst.rgb * src.a + (1.0 - dst.a) * src.rgb
375     * dst.a = src.a
376     * Note: Before API 23, the alpha channel was not correctly set.
377     *       Please use with caution when targeting older APIs.
378     *
379     * @param ain The source buffer
380     * @param aout The destination buffer
381     * @param opt LaunchOptions for clipping
382     */
383    public void forEachDstAtop(Allocation ain, Allocation aout, Script.LaunchOptions opt) {
384        blend(10, ain, aout, opt);
385    }
386
387    /**
388     * Get a KernelID for the DstAtop kernel.
389     *
390     * @return Script.KernelID The KernelID object.
391     */
392    public Script.KernelID getKernelIDDstAtop() {
393        return createKernelID(10, 3, null, null);
394    }
395
396    /**
397     * Sets dst = {src.r ^ dst.r, src.g ^ dst.g, src.b ^ dst.b, src.a ^ dst.a}
398     *
399     * @param ain The source buffer
400     * @param aout The destination buffer
401     */
402    public void forEachXor(Allocation ain, Allocation aout) {
403        forEachXor(ain, aout, null);
404    }
405
406    /**
407     * Sets dst = {src.r ^ dst.r, src.g ^ dst.g, src.b ^ dst.b, src.a ^ dst.a}
408     *
409     * <b>Note:</b> this is NOT the Porter/Duff XOR mode; this is a bitwise xor.
410     *
411     * @param ain The source buffer
412     * @param aout The destination buffer
413     * @param opt LaunchOptions for clipping
414     */
415    public void forEachXor(Allocation ain, Allocation aout, Script.LaunchOptions opt) {
416        blend(11, ain, aout, opt);
417    }
418
419    /**
420     * Get a KernelID for the Xor kernel.
421     *
422     * @return Script.KernelID The KernelID object.
423     */
424    public Script.KernelID getKernelIDXor() {
425        return createKernelID(11, 3, null, null);
426    }
427
428    ////////
429/*
430    public void forEachNormal(Allocation ain, Allocation aout) {
431        blend(12, ain, aout);
432    }
433
434    public void forEachAverage(Allocation ain, Allocation aout) {
435        blend(13, ain, aout);
436    }
437*/
438    /**
439     * Sets dst = src * dst
440     *
441     * @param ain The source buffer
442     * @param aout The destination buffer
443     */
444    public void forEachMultiply(Allocation ain, Allocation aout) {
445        forEachMultiply(ain, aout, null);
446    }
447
448    /**
449     * Sets dst = src * dst
450     *
451     * @param ain The source buffer
452     * @param aout The destination buffer
453     * @param opt LaunchOptions for clipping
454     */
455    public void forEachMultiply(Allocation ain, Allocation aout, Script.LaunchOptions opt) {
456        blend(14, ain, aout, opt);
457    }
458
459    /**
460     * Get a KernelID for the Multiply kernel.
461     *
462     * @return Script.KernelID The KernelID object.
463     */
464    public Script.KernelID getKernelIDMultiply() {
465        return createKernelID(14, 3, null, null);
466    }
467
468/*
469    public void forEachScreen(Allocation ain, Allocation aout) {
470        blend(15, ain, aout);
471    }
472
473    public void forEachDarken(Allocation ain, Allocation aout) {
474        blend(16, ain, aout);
475    }
476
477    public void forEachLighten(Allocation ain, Allocation aout) {
478        blend(17, ain, aout);
479    }
480
481    public void forEachOverlay(Allocation ain, Allocation aout) {
482        blend(18, ain, aout);
483    }
484
485    public void forEachHardlight(Allocation ain, Allocation aout) {
486        blend(19, ain, aout);
487    }
488
489    public void forEachSoftlight(Allocation ain, Allocation aout) {
490        blend(20, ain, aout);
491    }
492
493    public void forEachDifference(Allocation ain, Allocation aout) {
494        blend(21, ain, aout);
495    }
496
497    public void forEachNegation(Allocation ain, Allocation aout) {
498        blend(22, ain, aout);
499    }
500
501    public void forEachExclusion(Allocation ain, Allocation aout) {
502        blend(23, ain, aout);
503    }
504
505    public void forEachColorDodge(Allocation ain, Allocation aout) {
506        blend(24, ain, aout);
507    }
508
509    public void forEachInverseColorDodge(Allocation ain, Allocation aout) {
510        blend(25, ain, aout);
511    }
512
513    public void forEachSoftDodge(Allocation ain, Allocation aout) {
514        blend(26, ain, aout);
515    }
516
517    public void forEachColorBurn(Allocation ain, Allocation aout) {
518        blend(27, ain, aout);
519    }
520
521    public void forEachInverseColorBurn(Allocation ain, Allocation aout) {
522        blend(28, ain, aout);
523    }
524
525    public void forEachSoftBurn(Allocation ain, Allocation aout) {
526        blend(29, ain, aout);
527    }
528
529    public void forEachReflect(Allocation ain, Allocation aout) {
530        blend(30, ain, aout);
531    }
532
533    public void forEachGlow(Allocation ain, Allocation aout) {
534        blend(31, ain, aout);
535    }
536
537    public void forEachFreeze(Allocation ain, Allocation aout) {
538        blend(32, ain, aout);
539    }
540
541    public void forEachHeat(Allocation ain, Allocation aout) {
542        blend(33, ain, aout);
543    }
544*/
545    /**
546     * Sets dst = min(src + dst, 1.0)
547     *
548     * @param ain The source buffer
549     * @param aout The destination buffer
550     */
551    public void forEachAdd(Allocation ain, Allocation aout) {
552        forEachAdd(ain, aout, null);
553    }
554
555    /**
556     * Sets dst = min(src + dst, 1.0)
557     *
558     * @param ain The source buffer
559     * @param aout The destination buffer
560     * @param opt LaunchOptions for clipping
561     */
562    public void forEachAdd(Allocation ain, Allocation aout, Script.LaunchOptions opt) {
563        blend(34, ain, aout, opt);
564    }
565
566    /**
567     * Get a KernelID for the Add kernel.
568     *
569     * @return Script.KernelID The KernelID object.
570     */
571    public Script.KernelID getKernelIDAdd() {
572        return createKernelID(34, 3, null, null);
573    }
574
575    /**
576     * Sets dst = max(dst - src, 0.0)
577     *
578     * @param ain The source buffer
579     * @param aout The destination buffer
580     */
581    public void forEachSubtract(Allocation ain, Allocation aout) {
582        forEachSubtract(ain, aout, null);
583    }
584
585    /**
586     * Sets dst = max(dst - src, 0.0)
587     *
588     * @param ain The source buffer
589     * @param aout The destination buffer
590     * @param opt LaunchOptions for clipping
591     */
592    public void forEachSubtract(Allocation ain, Allocation aout, Script.LaunchOptions opt) {
593        blend(35, ain, aout, opt);
594    }
595
596    /**
597     * Get a KernelID for the Subtract kernel.
598     *
599     * @return Script.KernelID The KernelID object.
600     */
601    public Script.KernelID getKernelIDSubtract() {
602        return createKernelID(35, 3, null, null);
603    }
604
605/*
606    public void forEachStamp(Allocation ain, Allocation aout) {
607        blend(36, ain, aout);
608    }
609
610    public void forEachRed(Allocation ain, Allocation aout) {
611        blend(37, ain, aout);
612    }
613
614    public void forEachGreen(Allocation ain, Allocation aout) {
615        blend(38, ain, aout);
616    }
617
618    public void forEachBlue(Allocation ain, Allocation aout) {
619        blend(39, ain, aout);
620    }
621
622    public void forEachHue(Allocation ain, Allocation aout) {
623        blend(40, ain, aout);
624    }
625
626    public void forEachSaturation(Allocation ain, Allocation aout) {
627        blend(41, ain, aout);
628    }
629
630    public void forEachColor(Allocation ain, Allocation aout) {
631        blend(42, ain, aout);
632    }
633
634    public void forEachLuminosity(Allocation ain, Allocation aout) {
635        blend(43, ain, aout);
636    }
637*/
638}
639
640