rsUtils.h revision 6537404d5ad7ec19f0f26533d695d39909782781
10b167267bda99b68346045ccab14e810121d5de4Glenn Kasten/*
20b167267bda99b68346045ccab14e810121d5de4Glenn Kasten * Copyright (C) 2009 The Android Open Source Project
30b167267bda99b68346045ccab14e810121d5de4Glenn Kasten *
40b167267bda99b68346045ccab14e810121d5de4Glenn Kasten * Licensed under the Apache License, Version 2.0 (the "License");
50b167267bda99b68346045ccab14e810121d5de4Glenn Kasten * you may not use this file except in compliance with the License.
60b167267bda99b68346045ccab14e810121d5de4Glenn Kasten * You may obtain a copy of the License at
70b167267bda99b68346045ccab14e810121d5de4Glenn Kasten *
80b167267bda99b68346045ccab14e810121d5de4Glenn Kasten *      http://www.apache.org/licenses/LICENSE-2.0
90b167267bda99b68346045ccab14e810121d5de4Glenn Kasten *
100b167267bda99b68346045ccab14e810121d5de4Glenn Kasten * Unless required by applicable law or agreed to in writing, software
110b167267bda99b68346045ccab14e810121d5de4Glenn Kasten * distributed under the License is distributed on an "AS IS" BASIS,
120b167267bda99b68346045ccab14e810121d5de4Glenn Kasten * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
130b167267bda99b68346045ccab14e810121d5de4Glenn Kasten * See the License for the specific language governing permissions and
140b167267bda99b68346045ccab14e810121d5de4Glenn Kasten * limitations under the License.
150b167267bda99b68346045ccab14e810121d5de4Glenn Kasten */
160b167267bda99b68346045ccab14e810121d5de4Glenn Kasten
170b167267bda99b68346045ccab14e810121d5de4Glenn Kasten#ifndef ANDROID_RS_UTILS_H
180b167267bda99b68346045ccab14e810121d5de4Glenn Kasten#define ANDROID_RS_UTILS_H
19979a3f8743646af9999a89dff9e13b972b7efd87Glenn Kasten
20979a3f8743646af9999a89dff9e13b972b7efd87Glenn Kasten#define LOG_NDEBUG 0
21ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten#define LOG_TAG "RenderScript"
22daf661248ff6ea2e21799e5114c78b7c1d49630eGlenn Kasten
23daf661248ff6ea2e21799e5114c78b7c1d49630eGlenn Kasten#include <utils/Log.h>
240b167267bda99b68346045ccab14e810121d5de4Glenn Kasten
25ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten#include "rsStream.h"
26ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
27ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten#include <utils/String8.h>
28ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten#include <utils/Vector.h>
29ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
30ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten#include <stdlib.h>
31ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten#include <pthread.h>
32ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten#include <time.h>
33ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten#include <cutils/atomic.h>
34ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
35ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten#include <math.h>
36ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
37ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kastennamespace android {
38ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kastennamespace renderscript {
39ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
40ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten#if 1
41ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten#define rsAssert(v) do {if(!(v)) ALOGE("rsAssert failed: %s, in %s at %i", #v, __FILE__, __LINE__);} while (0)
42ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten#else
43ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten#define rsAssert(v) while (0)
44ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten#endif
45ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
46ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kastentemplate<typename T>
470b167267bda99b68346045ccab14e810121d5de4Glenn KastenT rsMin(T in1, T in2)
480b167267bda99b68346045ccab14e810121d5de4Glenn Kasten{
49ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    if (in1 > in2) {
50daf661248ff6ea2e21799e5114c78b7c1d49630eGlenn Kasten        return in2;
51daf661248ff6ea2e21799e5114c78b7c1d49630eGlenn Kasten    }
520b167267bda99b68346045ccab14e810121d5de4Glenn Kasten    return in1;
53ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten}
54ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
55ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kastentemplate<typename T>
56ed46c29d6a09112dbbf584c82953f63289596fd6Glenn KastenT rsMax(T in1, T in2) {
57ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    if (in1 < in2) {
58ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        return in2;
59ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    }
60ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    return in1;
61ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten}
62ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
63ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kastentemplate<typename T>
64ed46c29d6a09112dbbf584c82953f63289596fd6Glenn KastenT rsFindHighBit(T val) {
65ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    uint32_t bit = 0;
66ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    while (val > 1) {
67ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        bit++;
68ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        val>>=1;
69ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    }
70ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    return bit;
71ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten}
72ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
73ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kastentemplate<typename T>
74ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kastenbool rsIsPow2(T val) {
750b167267bda99b68346045ccab14e810121d5de4Glenn Kasten    return (val & (val-1)) == 0;
760b167267bda99b68346045ccab14e810121d5de4Glenn Kasten}
77ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
780b167267bda99b68346045ccab14e810121d5de4Glenn Kastentemplate<typename T>
790b167267bda99b68346045ccab14e810121d5de4Glenn KastenT rsHigherPow2(T v) {
800b167267bda99b68346045ccab14e810121d5de4Glenn Kasten    if (rsIsPow2(v)) {
810b167267bda99b68346045ccab14e810121d5de4Glenn Kasten        return v;
82ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    }
83ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    return 1 << (rsFindHighBit(v) + 1);
84ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten}
85ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
86ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kastentemplate<typename T>
87ed46c29d6a09112dbbf584c82953f63289596fd6Glenn KastenT rsLowerPow2(T v) {
88ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    if (rsIsPow2(v)) {
89ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        return v;
90ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    }
91ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    return 1 << rsFindHighBit(v);
92ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten}
93ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
94ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kastenstatic inline uint16_t rs888to565(uint32_t r, uint32_t g, uint32_t b) {
95ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    uint16_t t = 0;
96ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    t |= b >> 3;
97ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    t |= (g >> 2) << 5;
98ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    t |= (r >> 3) << 11;
99b91e32605ecf39e34ad39936b1ee193bb4e30225Glenn Kasten    return t;
100ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten}
101daf661248ff6ea2e21799e5114c78b7c1d49630eGlenn Kasten
102ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kastenstatic inline uint16_t rsBoxFilter565(uint16_t i1, uint16_t i2, uint16_t i3, uint16_t i4) {
103ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    uint32_t r = ((i1 & 0x1f) + (i2 & 0x1f) + (i3 & 0x1f) + (i4 & 0x1f));
104ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    uint32_t g = ((i1 >> 5) & 0x3f) + ((i2 >> 5) & 0x3f) + ((i3 >> 5) & 0x3f) + ((i4 >> 5) & 0x3f);
105ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    uint32_t b = ((i1 >> 11) + (i2 >> 11) + (i3 >> 11) + (i4 >> 11));
106ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    return (r >> 2) | ((g >> 2) << 5) | ((b >> 2) << 11);
107ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten}
108daf661248ff6ea2e21799e5114c78b7c1d49630eGlenn Kasten
109ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kastenstatic inline uint32_t rsBoxFilter8888(uint32_t i1, uint32_t i2, uint32_t i3, uint32_t i4) {
110ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    uint32_t r = (i1 & 0xff) +         (i2 & 0xff) +         (i3 & 0xff) +         (i4 & 0xff);
111ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    uint32_t g = ((i1 >> 8) & 0xff) +  ((i2 >> 8) & 0xff) +  ((i3 >> 8) & 0xff) +  ((i4 >> 8) & 0xff);
112daf661248ff6ea2e21799e5114c78b7c1d49630eGlenn Kasten    uint32_t b = ((i1 >> 16) & 0xff) + ((i2 >> 16) & 0xff) + ((i3 >> 16) & 0xff) + ((i4 >> 16) & 0xff);
113ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    uint32_t a = ((i1 >> 24) & 0xff) + ((i2 >> 24) & 0xff) + ((i3 >> 24) & 0xff) + ((i4 >> 24) & 0xff);
1143c170255cc71942f310b676d968cf73328aa5d70Jean-Michel Trivi    return (r >> 2) | ((g >> 2) << 8) | ((b >> 2) << 16) | ((a >> 2) << 24);
1153c170255cc71942f310b676d968cf73328aa5d70Jean-Michel Trivi}
1163c170255cc71942f310b676d968cf73328aa5d70Jean-Michel Trivi
1173c170255cc71942f310b676d968cf73328aa5d70Jean-Michel Trivi}
1183c170255cc71942f310b676d968cf73328aa5d70Jean-Michel Trivi}
1193c170255cc71942f310b676d968cf73328aa5d70Jean-Michel Trivi
1203c170255cc71942f310b676d968cf73328aa5d70Jean-Michel Trivi#endif //ANDROID_RS_OBJECT_BASE_H
121ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
1223c170255cc71942f310b676d968cf73328aa5d70Jean-Michel Trivi
123daf661248ff6ea2e21799e5114c78b7c1d49630eGlenn Kasten