blob: 7a876b3cf63f754787db9926f68a18fd09b54652 [file] [log] [blame]
Tim Murray84bf2b82012-10-31 16:03:16 -07001/*
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#ifndef ANDROID_RSCPPSTRUCTS_H
18#define ANDROID_RSCPPSTRUCTS_H
19
Jason Samsf9e077a2013-03-20 19:04:19 -070020#include "rsCppUtils.h"
Tim Murray0b575de2013-03-15 15:56:43 -070021#ifndef RS_SERVER
Tim Murray84bf2b82012-10-31 16:03:16 -070022#include "utils/RefBase.h"
Tim Murray0b575de2013-03-15 15:56:43 -070023#else
24#include "RefBase.h"
25#endif
Tim Murray84bf2b82012-10-31 16:03:16 -070026
Tim Murraya4230962013-07-17 16:50:10 -070027#include "rsDispatch.h"
28
Tim Murray96267c22013-02-12 11:25:12 -080029// Every row in an RS allocation is guaranteed to be aligned by this amount
30// Every row in a user-backed allocation must be aligned by this amount
31#define RS_CPU_ALLOCATION_ALIGNMENT 16
32
Tim Murray84bf2b82012-10-31 16:03:16 -070033namespace android {
Tim Murray9eb7f4b2012-11-16 14:02:18 -080034namespace RSC {
Tim Murray84bf2b82012-10-31 16:03:16 -070035
36typedef void (*ErrorHandlerFunc_t)(uint32_t errorNum, const char *errorText);
37typedef void (*MessageHandlerFunc_t)(uint32_t msgNum, const void *msgData, size_t msgLen);
38
39class RS;
40class BaseObj;
41class Element;
42class Type;
43class Allocation;
44class Script;
45class ScriptC;
46
47class RS : public android::LightRefBase<RS> {
48
49 public:
50 RS();
51 virtual ~RS();
52
Tim Murray4d252d62012-11-29 14:37:59 -080053 bool init(bool forceCpu = false, bool synchronous = false);
Tim Murray84bf2b82012-10-31 16:03:16 -070054
55 void setErrorHandler(ErrorHandlerFunc_t func);
56 ErrorHandlerFunc_t getErrorHandler() { return mErrorFunc; }
57
58 void setMessageHandler(MessageHandlerFunc_t func);
59 MessageHandlerFunc_t getMessageHandler() { return mMessageFunc; }
60
61 void throwError(const char *err) const;
62
63 RsContext getContext() { return mContext; }
64
Tim Murraybaca6c32012-11-14 16:51:46 -080065 void finish();
66
Tim Murraya4230962013-07-17 16:50:10 -070067 static dispatchTable* dispatch;
68
Tim Murray84bf2b82012-10-31 16:03:16 -070069 private:
Tim Murray4a92d122013-07-22 10:56:18 -070070 static bool usingNative;
Tim Murraya4230962013-07-17 16:50:10 -070071 static bool initDispatch(int targetApi);
72
Tim Murray4d252d62012-11-29 14:37:59 -080073 bool init(int targetApi, bool forceCpu, bool synchronous);
Tim Murray84bf2b82012-10-31 16:03:16 -070074 static void * threadProc(void *);
75
76 static bool gInitialized;
77 static pthread_mutex_t gInitMutex;
78
79 pthread_t mMessageThreadId;
80 pid_t mNativeMessageThreadId;
81 bool mMessageRun;
82
83 RsDevice mDev;
84 RsContext mContext;
85
86 ErrorHandlerFunc_t mErrorFunc;
87 MessageHandlerFunc_t mMessageFunc;
Tim Murraya4230962013-07-17 16:50:10 -070088 bool mInit;
Tim Murray84bf2b82012-10-31 16:03:16 -070089
90 struct {
91 Element *U8;
92 Element *I8;
93 Element *U16;
94 Element *I16;
95 Element *U32;
96 Element *I32;
97 Element *U64;
98 Element *I64;
99 Element *F32;
100 Element *F64;
101 Element *BOOLEAN;
102
103 Element *ELEMENT;
104 Element *TYPE;
105 Element *ALLOCATION;
106 Element *SAMPLER;
107 Element *SCRIPT;
108 Element *MESH;
109 Element *PROGRAM_FRAGMENT;
110 Element *PROGRAM_VERTEX;
111 Element *PROGRAM_RASTER;
112 Element *PROGRAM_STORE;
113
114 Element *A_8;
115 Element *RGB_565;
116 Element *RGB_888;
117 Element *RGBA_5551;
118 Element *RGBA_4444;
119 Element *RGBA_8888;
120
121 Element *FLOAT_2;
122 Element *FLOAT_3;
123 Element *FLOAT_4;
124
125 Element *DOUBLE_2;
126 Element *DOUBLE_3;
127 Element *DOUBLE_4;
128
129 Element *UCHAR_2;
130 Element *UCHAR_3;
131 Element *UCHAR_4;
132
133 Element *CHAR_2;
134 Element *CHAR_3;
135 Element *CHAR_4;
136
137 Element *USHORT_2;
138 Element *USHORT_3;
139 Element *USHORT_4;
140
141 Element *SHORT_2;
142 Element *SHORT_3;
143 Element *SHORT_4;
144
145 Element *UINT_2;
146 Element *UINT_3;
147 Element *UINT_4;
148
149 Element *INT_2;
150 Element *INT_3;
151 Element *INT_4;
152
153 Element *ULONG_2;
154 Element *ULONG_3;
155 Element *ULONG_4;
156
157 Element *LONG_2;
158 Element *LONG_3;
159 Element *LONG_4;
160
161 Element *MATRIX_4X4;
162 Element *MATRIX_3X3;
163 Element *MATRIX_2X2;
164 } mElements;
165
166};
167
168class BaseObj : public android::LightRefBase<BaseObj> {
169protected:
170 void *mID;
171 sp<RS> mRS;
172 String8 mName;
173
174 BaseObj(void *id, sp<RS> rs);
175 void checkValid();
176
177 static void * getObjID(sp<const BaseObj> o);
178
179public:
180
181 void * getID() const;
182 virtual ~BaseObj();
183 virtual void updateFromNative();
184 virtual bool equals(const BaseObj *obj);
185};
186
187
188class Allocation : public BaseObj {
189protected:
190 android::sp<const Type> mType;
191 uint32_t mUsage;
192 android::sp<Allocation> mAdaptedAllocation;
193
194 bool mConstrainedLOD;
195 bool mConstrainedFace;
196 bool mConstrainedY;
197 bool mConstrainedZ;
198 bool mReadAllowed;
199 bool mWriteAllowed;
200 uint32_t mSelectedY;
201 uint32_t mSelectedZ;
202 uint32_t mSelectedLOD;
203 RsAllocationCubemapFace mSelectedFace;
204
205 uint32_t mCurrentDimX;
206 uint32_t mCurrentDimY;
207 uint32_t mCurrentDimZ;
208 uint32_t mCurrentCount;
209
210 void * getIDSafe() const;
211 void updateCacheInfo(sp<const Type> t);
212
213 Allocation(void *id, sp<RS> rs, sp<const Type> t, uint32_t usage);
214
215 void validateIsInt32();
216 void validateIsInt16();
217 void validateIsInt8();
218 void validateIsFloat32();
219 void validateIsObject();
220
221 virtual void updateFromNative();
222
223 void validate2DRange(uint32_t xoff, uint32_t yoff, uint32_t w, uint32_t h);
224
225public:
226 android::sp<const Type> getType() {
227 return mType;
228 }
229
230 void syncAll(RsAllocationUsageType srcLocation);
231 void ioSendOutput();
232 void ioGetInput();
233
234 void generateMipmaps();
Tim Murray509ea5c2012-11-13 11:56:40 -0800235
Tim Murray0b93e302012-11-15 14:56:54 -0800236 void copy1DRangeFrom(uint32_t off, size_t count, const void *data);
Tim Murraya4cbc2b2012-11-14 17:18:08 -0800237 void copy1DRangeFrom(uint32_t off, size_t count, sp<const Allocation> data, uint32_t dataOff);
Tim Murray84bf2b82012-10-31 16:03:16 -0700238
Tim Murray0b93e302012-11-15 14:56:54 -0800239 void copy1DRangeTo(uint32_t off, size_t count, void *data);
240
241 void copy1DFrom(const void* data);
242 void copy1DTo(void* data);
Tim Murraya4cbc2b2012-11-14 17:18:08 -0800243
Tim Murray84bf2b82012-10-31 16:03:16 -0700244 void copy2DRangeFrom(uint32_t xoff, uint32_t yoff, uint32_t w, uint32_t h,
Tim Murray0b93e302012-11-15 14:56:54 -0800245 const void *data);
Tim Murray7b3e3092012-11-16 13:32:24 -0800246
247 void copy2DRangeTo(uint32_t xoff, uint32_t yoff, uint32_t w, uint32_t h,
248 void *data);
249
Tim Murray0b93e302012-11-15 14:56:54 -0800250 void copy2DRangeFrom(uint32_t xoff, uint32_t yoff, uint32_t w, uint32_t h,
251 sp<const Allocation> data, uint32_t dataXoff, uint32_t dataYoff);
Tim Murray84bf2b82012-10-31 16:03:16 -0700252
Tim Murray358747a2012-11-26 13:52:04 -0800253 void copy2DStridedFrom(uint32_t xoff, uint32_t yoff, uint32_t w, uint32_t h,
254 const void *data, size_t stride);
255 void copy2DStridedFrom(const void *data, size_t stride);
256
257 void copy2DStridedTo(uint32_t xoff, uint32_t yoff, uint32_t w, uint32_t h,
258 void *data, size_t stride);
259 void copy2DStridedTo(void *data, size_t stride);
260
Tim Murray84bf2b82012-10-31 16:03:16 -0700261 void resize(int dimX);
262 void resize(int dimX, int dimY);
263
264 static sp<Allocation> createTyped(sp<RS> rs, sp<const Type> type,
265 RsAllocationMipmapControl mips, uint32_t usage);
266 static sp<Allocation> createTyped(sp<RS> rs, sp<const Type> type,
267 RsAllocationMipmapControl mips, uint32_t usage, void * pointer);
268
269 static sp<Allocation> createTyped(sp<RS> rs, sp<const Type> type,
270 uint32_t usage = RS_ALLOCATION_USAGE_SCRIPT);
271 static sp<Allocation> createSized(sp<RS> rs, sp<const Element> e, size_t count,
272 uint32_t usage = RS_ALLOCATION_USAGE_SCRIPT);
Tim Murray684726c2012-11-14 11:57:42 -0800273 static sp<Allocation> createSized2D(sp<RS> rs, sp<const Element> e,
274 size_t x, size_t y,
275 uint32_t usage = RS_ALLOCATION_USAGE_SCRIPT);
276
Tim Murray84bf2b82012-10-31 16:03:16 -0700277
278};
279
280class Element : public BaseObj {
281public:
282 bool isComplex();
283 size_t getSubElementCount() {
284 return mVisibleElementMap.size();
285 }
286
287 sp<const Element> getSubElement(uint32_t index);
288 const char * getSubElementName(uint32_t index);
289 size_t getSubElementArraySize(uint32_t index);
290 uint32_t getSubElementOffsetBytes(uint32_t index);
291 RsDataType getDataType() const {
292 return mType;
293 }
294
295 RsDataKind getDataKind() const {
296 return mKind;
297 }
298
299 size_t getSizeBytes() const {
300 return mSizeBytes;
301 }
302
303 static sp<const Element> BOOLEAN(sp<RS> rs);
304 static sp<const Element> U8(sp<RS> rs);
305 static sp<const Element> I8(sp<RS> rs);
306 static sp<const Element> U16(sp<RS> rs);
307 static sp<const Element> I16(sp<RS> rs);
308 static sp<const Element> U32(sp<RS> rs);
309 static sp<const Element> I32(sp<RS> rs);
310 static sp<const Element> U64(sp<RS> rs);
311 static sp<const Element> I64(sp<RS> rs);
312 static sp<const Element> F32(sp<RS> rs);
313 static sp<const Element> F64(sp<RS> rs);
314 static sp<const Element> ELEMENT(sp<RS> rs);
315 static sp<const Element> TYPE(sp<RS> rs);
316 static sp<const Element> ALLOCATION(sp<RS> rs);
317 static sp<const Element> SAMPLER(sp<RS> rs);
318 static sp<const Element> SCRIPT(sp<RS> rs);
319 static sp<const Element> MESH(sp<RS> rs);
320 static sp<const Element> PROGRAM_FRAGMENT(sp<RS> rs);
321 static sp<const Element> PROGRAM_VERTEX(sp<RS> rs);
322 static sp<const Element> PROGRAM_RASTER(sp<RS> rs);
323 static sp<const Element> PROGRAM_STORE(sp<RS> rs);
324
325 static sp<const Element> A_8(sp<RS> rs);
326 static sp<const Element> RGB_565(sp<RS> rs);
327 static sp<const Element> RGB_888(sp<RS> rs);
328 static sp<const Element> RGBA_5551(sp<RS> rs);
329 static sp<const Element> RGBA_4444(sp<RS> rs);
330 static sp<const Element> RGBA_8888(sp<RS> rs);
331
332 static sp<const Element> F32_2(sp<RS> rs);
333 static sp<const Element> F32_3(sp<RS> rs);
334 static sp<const Element> F32_4(sp<RS> rs);
335 static sp<const Element> F64_2(sp<RS> rs);
336 static sp<const Element> F64_3(sp<RS> rs);
337 static sp<const Element> F64_4(sp<RS> rs);
338 static sp<const Element> U8_2(sp<RS> rs);
339 static sp<const Element> U8_3(sp<RS> rs);
340 static sp<const Element> U8_4(sp<RS> rs);
341 static sp<const Element> I8_2(sp<RS> rs);
342 static sp<const Element> I8_3(sp<RS> rs);
343 static sp<const Element> I8_4(sp<RS> rs);
344 static sp<const Element> U16_2(sp<RS> rs);
345 static sp<const Element> U16_3(sp<RS> rs);
346 static sp<const Element> U16_4(sp<RS> rs);
347 static sp<const Element> I16_2(sp<RS> rs);
348 static sp<const Element> I16_3(sp<RS> rs);
349 static sp<const Element> I16_4(sp<RS> rs);
350 static sp<const Element> U32_2(sp<RS> rs);
351 static sp<const Element> U32_3(sp<RS> rs);
352 static sp<const Element> U32_4(sp<RS> rs);
353 static sp<const Element> I32_2(sp<RS> rs);
354 static sp<const Element> I32_3(sp<RS> rs);
355 static sp<const Element> I32_4(sp<RS> rs);
356 static sp<const Element> U64_2(sp<RS> rs);
357 static sp<const Element> U64_3(sp<RS> rs);
358 static sp<const Element> U64_4(sp<RS> rs);
359 static sp<const Element> I64_2(sp<RS> rs);
360 static sp<const Element> I64_3(sp<RS> rs);
361 static sp<const Element> I64_4(sp<RS> rs);
362 static sp<const Element> MATRIX_4X4(sp<RS> rs);
363 static sp<const Element> MATRIX_3X3(sp<RS> rs);
364 static sp<const Element> MATRIX_2X2(sp<RS> rs);
365
366 Element(void *id, sp<RS> rs,
367 android::Vector<sp<Element> > &elements,
368 android::Vector<android::String8> &elementNames,
369 android::Vector<uint32_t> &arraySizes);
370 Element(void *id, sp<RS> rs, RsDataType dt, RsDataKind dk, bool norm, uint32_t size);
371 Element(sp<RS> rs);
372 virtual ~Element();
373
374 void updateFromNative();
375 static sp<const Element> createUser(sp<RS> rs, RsDataType dt);
376 static sp<const Element> createVector(sp<RS> rs, RsDataType dt, uint32_t size);
377 static sp<const Element> createPixel(sp<RS> rs, RsDataType dt, RsDataKind dk);
378 bool isCompatible(sp<const Element>e);
379
380 class Builder {
381 private:
382 sp<RS> mRS;
383 android::Vector<sp<Element> > mElements;
384 android::Vector<android::String8> mElementNames;
385 android::Vector<uint32_t> mArraySizes;
386 bool mSkipPadding;
387
388 public:
389 Builder(sp<RS> rs);
390 ~Builder();
391 void add(sp<Element>, android::String8 &name, uint32_t arraySize = 1);
392 sp<const Element> create();
393 };
394
395private:
396 void updateVisibleSubElements();
397
398 android::Vector<sp</*const*/ Element> > mElements;
399 android::Vector<android::String8> mElementNames;
400 android::Vector<uint32_t> mArraySizes;
401 android::Vector<uint32_t> mVisibleElementMap;
402 android::Vector<uint32_t> mOffsetInBytes;
403
404 RsDataType mType;
405 RsDataKind mKind;
406 bool mNormalized;
407 size_t mSizeBytes;
408 size_t mVectorSize;
409};
410
Stephen Hines2c7206e2012-11-14 19:47:01 -0800411class FieldPacker {
412protected:
413 unsigned char* mData;
414 size_t mPos;
415 size_t mLen;
416
417public:
418 FieldPacker(size_t len)
419 : mPos(0),
420 mLen(len) {
421 mData = new unsigned char[len];
422 }
423
424 virtual ~FieldPacker() {
425 delete [] mData;
426 }
427
428 void align(size_t v) {
429 if ((v & (v - 1)) != 0) {
430 ALOGE("Non-power-of-two alignment: %zu", v);
431 return;
432 }
433
434 while ((mPos & (v - 1)) != 0) {
435 mData[mPos++] = 0;
436 }
437 }
438
439 void reset() {
440 mPos = 0;
441 }
442
443 void reset(size_t i) {
444 if (i >= mLen) {
445 ALOGE("Out of bounds: i (%zu) >= len (%zu)", i, mLen);
446 return;
447 }
448 mPos = i;
449 }
450
451 void skip(size_t i) {
452 size_t res = mPos + i;
453 if (res > mLen) {
454 ALOGE("Exceeded buffer length: i (%zu) > len (%zu)", i, mLen);
455 return;
456 }
457 mPos = res;
458 }
459
460 void* getData() const {
461 return mData;
462 }
463
464 size_t getLength() const {
465 return mLen;
466 }
467
468 template <typename T>
469 void add(T t) {
470 align(sizeof(t));
471 if (mPos + sizeof(t) <= mLen) {
472 memcpy(&mData[mPos], &t, sizeof(t));
473 mPos += sizeof(t);
474 }
475 }
Stephen Hines43514cd2012-11-16 14:33:47 -0800476
477 /*
478 void add(rs_matrix4x4 m) {
479 for (size_t i = 0; i < 16; i++) {
480 add(m.m[i]);
481 }
482 }
483
484 void add(rs_matrix3x3 m) {
485 for (size_t i = 0; i < 9; i++) {
486 add(m.m[i]);
487 }
488 }
489
490 void add(rs_matrix2x2 m) {
491 for (size_t i = 0; i < 4; i++) {
492 add(m.m[i]);
493 }
494 }
495 */
496
497 void add(BaseObj* obj) {
498 if (obj != NULL) {
499 add((uint32_t) (uintptr_t) obj->getID());
500 } else {
501 add((uint32_t) 0);
502 }
503 }
Stephen Hines2c7206e2012-11-14 19:47:01 -0800504};
505
Tim Murray84bf2b82012-10-31 16:03:16 -0700506class Type : public BaseObj {
507protected:
508 friend class Allocation;
509
510 uint32_t mDimX;
511 uint32_t mDimY;
512 uint32_t mDimZ;
513 bool mDimMipmaps;
514 bool mDimFaces;
515 size_t mElementCount;
516 sp<const Element> mElement;
517
518 void calcElementCount();
519 virtual void updateFromNative();
520
521public:
522
523 sp<const Element> getElement() const {
524 return mElement;
525 }
526
527 uint32_t getX() const {
528 return mDimX;
529 }
530
531 uint32_t getY() const {
532 return mDimY;
533 }
534
535 uint32_t getZ() const {
536 return mDimZ;
537 }
538
539 bool hasMipmaps() const {
540 return mDimMipmaps;
541 }
542
543 bool hasFaces() const {
544 return mDimFaces;
545 }
546
547 size_t getCount() const {
548 return mElementCount;
549 }
550
551 size_t getSizeBytes() const {
552 return mElementCount * mElement->getSizeBytes();
553 }
554
555 Type(void *id, sp<RS> rs);
556
Tim Murray96267c22013-02-12 11:25:12 -0800557 static sp<const Type> create(sp<RS> rs, sp<const Element> e, uint32_t dimX, uint32_t dimY, uint32_t dimZ);
Tim Murray84bf2b82012-10-31 16:03:16 -0700558
559 class Builder {
560 protected:
561 sp<RS> mRS;
562 uint32_t mDimX;
563 uint32_t mDimY;
564 uint32_t mDimZ;
565 bool mDimMipmaps;
566 bool mDimFaces;
567 sp<const Element> mElement;
568
569 public:
570 Builder(sp<RS> rs, sp<const Element> e);
571
572 void setX(uint32_t value);
573 void setY(int value);
574 void setMipmaps(bool value);
575 void setFaces(bool value);
576 sp<const Type> create();
577 };
578
579};
580
581class Script : public BaseObj {
582private:
583
584protected:
585 Script(void *id, sp<RS> rs);
586 void forEach(uint32_t slot, sp<const Allocation> in, sp<const Allocation> out,
587 const void *v, size_t) const;
588 void bindAllocation(sp<Allocation> va, uint32_t slot) const;
589 void setVar(uint32_t index, const void *, size_t len) const;
590 void setVar(uint32_t index, sp<const BaseObj> o) const;
591 void invoke(uint32_t slot, const void *v, size_t len) const;
592
593
594 void invoke(uint32_t slot) const {
595 invoke(slot, NULL, 0);
596 }
597 void setVar(uint32_t index, float v) const {
598 setVar(index, &v, sizeof(v));
599 }
600 void setVar(uint32_t index, double v) const {
601 setVar(index, &v, sizeof(v));
602 }
603 void setVar(uint32_t index, int32_t v) const {
604 setVar(index, &v, sizeof(v));
605 }
606 void setVar(uint32_t index, int64_t v) const {
607 setVar(index, &v, sizeof(v));
608 }
609 void setVar(uint32_t index, bool v) const {
610 setVar(index, &v, sizeof(v));
611 }
612
613public:
614 class FieldBase {
615 protected:
616 sp<const Element> mElement;
617 sp<Allocation> mAllocation;
618
619 void init(sp<RS> rs, uint32_t dimx, uint32_t usages = 0);
620
621 public:
622 sp<const Element> getElement() {
623 return mElement;
624 }
625
626 sp<const Type> getType() {
627 return mAllocation->getType();
628 }
629
630 sp<const Allocation> getAllocation() {
631 return mAllocation;
632 }
633
634 //void updateAllocation();
635 };
636};
637
638class ScriptC : public Script {
639protected:
640 ScriptC(sp<RS> rs,
641 const void *codeTxt, size_t codeLength,
642 const char *cachedName, size_t cachedNameLength,
643 const char *cacheDir, size_t cacheDirLength);
644
645};
646
Tim Murray7f0d5682012-11-08 16:35:24 -0800647class ScriptIntrinsic : public Script {
648 protected:
Tim Murray3cd44af2012-11-14 11:25:27 -0800649 ScriptIntrinsic(sp<RS> rs, int id, sp<const Element> e);
Tim Murray7f0d5682012-11-08 16:35:24 -0800650};
651
652class ScriptIntrinsicBlend : public ScriptIntrinsic {
653 public:
Tim Murray3cd44af2012-11-14 11:25:27 -0800654 ScriptIntrinsicBlend(sp<RS> rs, sp <const Element> e);
Tim Murray7f0d5682012-11-08 16:35:24 -0800655 void blendClear(sp<Allocation> in, sp<Allocation> out);
656 void blendSrc(sp<Allocation> in, sp<Allocation> out);
657 void blendDst(sp<Allocation> in, sp<Allocation> out);
658 void blendSrcOver(sp<Allocation> in, sp<Allocation> out);
659 void blendDstOver(sp<Allocation> in, sp<Allocation> out);
660 void blendSrcIn(sp<Allocation> in, sp<Allocation> out);
661 void blendDstIn(sp<Allocation> in, sp<Allocation> out);
662 void blendSrcOut(sp<Allocation> in, sp<Allocation> out);
663 void blendDstOut(sp<Allocation> in, sp<Allocation> out);
664 void blendSrcAtop(sp<Allocation> in, sp<Allocation> out);
665 void blendDstAtop(sp<Allocation> in, sp<Allocation> out);
666 void blendXor(sp<Allocation> in, sp<Allocation> out);
667 void blendMultiply(sp<Allocation> in, sp<Allocation> out);
668 void blendAdd(sp<Allocation> in, sp<Allocation> out);
669 void blendSubtract(sp<Allocation> in, sp<Allocation> out);
670};
Tim Murray84bf2b82012-10-31 16:03:16 -0700671
Tim Murray8f1e60c2012-11-13 12:25:11 -0800672class ScriptIntrinsicBlur : public ScriptIntrinsic {
673 public:
Tim Murray3cd44af2012-11-14 11:25:27 -0800674 ScriptIntrinsicBlur(sp<RS> rs, sp <const Element> e);
Tim Murray8f1e60c2012-11-13 12:25:11 -0800675 void blur(sp<Allocation> in, sp<Allocation> out);
676 void setRadius(float radius);
677};
678
Tim Murray84bf2b82012-10-31 16:03:16 -0700679}
Tim Murray7f0d5682012-11-08 16:35:24 -0800680
Tim Murray84bf2b82012-10-31 16:03:16 -0700681}
682
683#endif