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 
17 package android.renderscript;
18 
19 
20 /**
21  * Intrinsic kernels for blending two {@link android.renderscript.Allocation} objects.
22  **/
23 public class ScriptIntrinsicBlend extends ScriptIntrinsic {
ScriptIntrinsicBlend(long id, RenderScript rs)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      */
create(RenderScript rs, Element e)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 
blend(int id, Allocation ain, Allocation aout, Script.LaunchOptions opt)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      */
forEachClear(Allocation ain, Allocation aout)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      */
forEachClear(Allocation ain, Allocation aout, Script.LaunchOptions opt)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      */
getKernelIDClear()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      */
forEachSrc(Allocation ain, Allocation aout)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      */
forEachSrc(Allocation ain, Allocation aout, Script.LaunchOptions opt)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      */
getKernelIDSrc()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      */
forEachDst(Allocation ain, Allocation aout)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      */
forEachDst(Allocation ain, Allocation aout, Script.LaunchOptions opt)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      */
getKernelIDDst()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      */
forEachSrcOver(Allocation ain, Allocation aout)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      */
forEachSrcOver(Allocation ain, Allocation aout, Script.LaunchOptions opt)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      */
getKernelIDSrcOver()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      */
forEachDstOver(Allocation ain, Allocation aout)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      */
forEachDstOver(Allocation ain, Allocation aout, Script.LaunchOptions opt)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      */
getKernelIDDstOver()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      */
forEachSrcIn(Allocation ain, Allocation aout)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      */
forEachSrcIn(Allocation ain, Allocation aout, Script.LaunchOptions opt)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      */
getKernelIDSrcIn()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      */
forEachDstIn(Allocation ain, Allocation aout)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      */
forEachDstIn(Allocation ain, Allocation aout, Script.LaunchOptions opt)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      */
getKernelIDDstIn()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      */
forEachSrcOut(Allocation ain, Allocation aout)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      */
forEachSrcOut(Allocation ain, Allocation aout, Script.LaunchOptions opt)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      */
getKernelIDSrcOut()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      */
forEachDstOut(Allocation ain, Allocation aout)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      */
forEachDstOut(Allocation ain, Allocation aout, Script.LaunchOptions opt)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      */
getKernelIDDstOut()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      */
forEachSrcAtop(Allocation ain, Allocation aout)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      */
forEachSrcAtop(Allocation ain, Allocation aout, Script.LaunchOptions opt)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      */
getKernelIDSrcAtop()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      */
forEachDstAtop(Allocation ain, Allocation aout)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      */
forEachDstAtop(Allocation ain, Allocation aout, Script.LaunchOptions opt)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      */
getKernelIDDstAtop()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      */
forEachXor(Allocation ain, Allocation aout)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      */
forEachXor(Allocation ain, Allocation aout, Script.LaunchOptions opt)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      */
getKernelIDXor()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      */
forEachMultiply(Allocation ain, Allocation aout)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      */
forEachMultiply(Allocation ain, Allocation aout, Script.LaunchOptions opt)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      */
getKernelIDMultiply()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      */
forEachAdd(Allocation ain, Allocation aout)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      */
forEachAdd(Allocation ain, Allocation aout, Script.LaunchOptions opt)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      */
getKernelIDAdd()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      */
forEachSubtract(Allocation ain, Allocation aout)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      */
forEachSubtract(Allocation ain, Allocation aout, Script.LaunchOptions opt)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      */
getKernelIDSubtract()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