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