rsUtils.h revision 0b575de8ed0b628d84d256f5846500b0385979bd
1326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams/*
20b575de8ed0b628d84d256f5846500b0385979bdTim Murray * Copyright (C) 2013 The Android Open Source Project
3326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams *
4326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * Licensed under the Apache License, Version 2.0 (the "License");
5326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * you may not use this file except in compliance with the License.
6326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * You may obtain a copy of the License at
7326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams *
8326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams *      http://www.apache.org/licenses/LICENSE-2.0
9326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams *
10326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * Unless required by applicable law or agreed to in writing, software
11326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * distributed under the License is distributed on an "AS IS" BASIS,
12326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * See the License for the specific language governing permissions and
14326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * limitations under the License.
15326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams */
16326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
17326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams#ifndef ANDROID_RS_UTILS_H
18326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams#define ANDROID_RS_UTILS_H
19326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
203bce7891a1b1729f76714db08cd3cd79b91d7942Jason Sams#define LOG_NDEBUG 0
21613cad1702dbb76eb2a6ba0cfcb43b9fe207cebcJason Sams#define LOG_TAG "RenderScript"
22fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk
230b575de8ed0b628d84d256f5846500b0385979bdTim Murray#ifndef RS_SERVER
241aa5a4eb81b8b88aeb5d2b6f4c47356fd0a62923Jason Sams#include <utils/Log.h>
258b2c065dfc16c148e2829a19e83d2269b9bcd4ccJason Sams#include <utils/String8.h>
26fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk#include <utils/Vector.h>
270b575de8ed0b628d84d256f5846500b0385979bdTim Murray#include <cutils/atomic.h>
280b575de8ed0b628d84d256f5846500b0385979bdTim Murray#endif
290b575de8ed0b628d84d256f5846500b0385979bdTim Murray
300b575de8ed0b628d84d256f5846500b0385979bdTim Murray#include <stdint.h>
31fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk
32326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams#include <stdlib.h>
331aa5a4eb81b8b88aeb5d2b6f4c47356fd0a62923Jason Sams#include <pthread.h>
34cfb1d11ce6826fce7241d316d8b7dcab661f63a6Jason Sams#include <time.h>
35326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
36a5577808737a394bdb156fbeb80018d0a4d8438dJason Sams#include <math.h>
37a5577808737a394bdb156fbeb80018d0a4d8438dJason Sams
380b575de8ed0b628d84d256f5846500b0385979bdTim Murray#ifdef RS_SERVER
390b575de8ed0b628d84d256f5846500b0385979bdTim Murray
400b575de8ed0b628d84d256f5846500b0385979bdTim Murray#include <string>
410b575de8ed0b628d84d256f5846500b0385979bdTim Murray#include <vector>
420b575de8ed0b628d84d256f5846500b0385979bdTim Murray#include <algorithm>
430b575de8ed0b628d84d256f5846500b0385979bdTim Murray
440b575de8ed0b628d84d256f5846500b0385979bdTim Murray#define ALOGE(...)
450b575de8ed0b628d84d256f5846500b0385979bdTim Murray#define ALOGV(...)
460b575de8ed0b628d84d256f5846500b0385979bdTim Murray#define ALOGW(...)
470b575de8ed0b628d84d256f5846500b0385979bdTim Murray#define ALOGD(...)
480b575de8ed0b628d84d256f5846500b0385979bdTim Murray
490b575de8ed0b628d84d256f5846500b0385979bdTim Murraynamespace android {
500b575de8ed0b628d84d256f5846500b0385979bdTim Murray
510b575de8ed0b628d84d256f5846500b0385979bdTim Murray    // server has no Vector or String8 classes; implement on top of STL
520b575de8ed0b628d84d256f5846500b0385979bdTim Murray    class String8: public std::string {
530b575de8ed0b628d84d256f5846500b0385979bdTim Murray    public:
540b575de8ed0b628d84d256f5846500b0385979bdTim Murray    String8(const char *ptr) : std::string(ptr) {
550b575de8ed0b628d84d256f5846500b0385979bdTim Murray
560b575de8ed0b628d84d256f5846500b0385979bdTim Murray        }
570b575de8ed0b628d84d256f5846500b0385979bdTim Murray    String8() : std::string() {
580b575de8ed0b628d84d256f5846500b0385979bdTim Murray
590b575de8ed0b628d84d256f5846500b0385979bdTim Murray        }
600b575de8ed0b628d84d256f5846500b0385979bdTim Murray
610b575de8ed0b628d84d256f5846500b0385979bdTim Murray        const char* string() const {
620b575de8ed0b628d84d256f5846500b0385979bdTim Murray            return this->c_str();
630b575de8ed0b628d84d256f5846500b0385979bdTim Murray        }
640b575de8ed0b628d84d256f5846500b0385979bdTim Murray
650b575de8ed0b628d84d256f5846500b0385979bdTim Murray        void setTo(const char* str, ssize_t len) {
660b575de8ed0b628d84d256f5846500b0385979bdTim Murray            this->assign(str, len);
670b575de8ed0b628d84d256f5846500b0385979bdTim Murray        }
680b575de8ed0b628d84d256f5846500b0385979bdTim Murray        void setTo(const char* str) {
690b575de8ed0b628d84d256f5846500b0385979bdTim Murray            this->assign(str);
700b575de8ed0b628d84d256f5846500b0385979bdTim Murray        }
710b575de8ed0b628d84d256f5846500b0385979bdTim Murray
720b575de8ed0b628d84d256f5846500b0385979bdTim Murray    };
730b575de8ed0b628d84d256f5846500b0385979bdTim Murray
740b575de8ed0b628d84d256f5846500b0385979bdTim Murray    template <class T> class Vector: public std::vector<T> {
750b575de8ed0b628d84d256f5846500b0385979bdTim Murray    public:
760b575de8ed0b628d84d256f5846500b0385979bdTim Murray        void push(T obj) {
770b575de8ed0b628d84d256f5846500b0385979bdTim Murray            this->push_back(obj);
780b575de8ed0b628d84d256f5846500b0385979bdTim Murray        }
790b575de8ed0b628d84d256f5846500b0385979bdTim Murray        void removeAt(uint32_t index) {
800b575de8ed0b628d84d256f5846500b0385979bdTim Murray            this->erase(this->begin() + index);
810b575de8ed0b628d84d256f5846500b0385979bdTim Murray        }
820b575de8ed0b628d84d256f5846500b0385979bdTim Murray        ssize_t add(const T& obj) {
830b575de8ed0b628d84d256f5846500b0385979bdTim Murray            this->push_back(obj);
840b575de8ed0b628d84d256f5846500b0385979bdTim Murray            return this->size() - 1;
850b575de8ed0b628d84d256f5846500b0385979bdTim Murray        }
860b575de8ed0b628d84d256f5846500b0385979bdTim Murray        void setCapacity(ssize_t capacity) {
870b575de8ed0b628d84d256f5846500b0385979bdTim Murray            this->resize(capacity);
880b575de8ed0b628d84d256f5846500b0385979bdTim Murray        }
890b575de8ed0b628d84d256f5846500b0385979bdTim Murray
900b575de8ed0b628d84d256f5846500b0385979bdTim Murray        T* editArray() {
910b575de8ed0b628d84d256f5846500b0385979bdTim Murray            return this->data();
920b575de8ed0b628d84d256f5846500b0385979bdTim Murray        }
930b575de8ed0b628d84d256f5846500b0385979bdTim Murray
940b575de8ed0b628d84d256f5846500b0385979bdTim Murray        const T* array() {
950b575de8ed0b628d84d256f5846500b0385979bdTim Murray            return this->data();
960b575de8ed0b628d84d256f5846500b0385979bdTim Murray        }
970b575de8ed0b628d84d256f5846500b0385979bdTim Murray
980b575de8ed0b628d84d256f5846500b0385979bdTim Murray    };
990b575de8ed0b628d84d256f5846500b0385979bdTim Murray
1000b575de8ed0b628d84d256f5846500b0385979bdTim Murray    template<> class Vector<bool>: public std::vector<char> {
1010b575de8ed0b628d84d256f5846500b0385979bdTim Murray    public:
1020b575de8ed0b628d84d256f5846500b0385979bdTim Murray        void push(bool obj) {
1030b575de8ed0b628d84d256f5846500b0385979bdTim Murray            this->push_back(obj);
1040b575de8ed0b628d84d256f5846500b0385979bdTim Murray        }
1050b575de8ed0b628d84d256f5846500b0385979bdTim Murray        void removeAt(uint32_t index) {
1060b575de8ed0b628d84d256f5846500b0385979bdTim Murray            this->erase(this->begin() + index);
1070b575de8ed0b628d84d256f5846500b0385979bdTim Murray        }
1080b575de8ed0b628d84d256f5846500b0385979bdTim Murray        ssize_t add(const bool& obj) {
1090b575de8ed0b628d84d256f5846500b0385979bdTim Murray            this->push_back(obj);
1100b575de8ed0b628d84d256f5846500b0385979bdTim Murray            return this->size() - 1;
1110b575de8ed0b628d84d256f5846500b0385979bdTim Murray        }
1120b575de8ed0b628d84d256f5846500b0385979bdTim Murray        void setCapacity(ssize_t capacity) {
1130b575de8ed0b628d84d256f5846500b0385979bdTim Murray            this->resize(capacity);
1140b575de8ed0b628d84d256f5846500b0385979bdTim Murray        }
1150b575de8ed0b628d84d256f5846500b0385979bdTim Murray
1160b575de8ed0b628d84d256f5846500b0385979bdTim Murray        bool* editArray() {
1170b575de8ed0b628d84d256f5846500b0385979bdTim Murray            return (bool*)this->data();
1180b575de8ed0b628d84d256f5846500b0385979bdTim Murray        }
1190b575de8ed0b628d84d256f5846500b0385979bdTim Murray
1200b575de8ed0b628d84d256f5846500b0385979bdTim Murray        const bool* array() {
1210b575de8ed0b628d84d256f5846500b0385979bdTim Murray            return (const bool*)this->data();
1220b575de8ed0b628d84d256f5846500b0385979bdTim Murray        }
1230b575de8ed0b628d84d256f5846500b0385979bdTim Murray    };
1240b575de8ed0b628d84d256f5846500b0385979bdTim Murray
1250b575de8ed0b628d84d256f5846500b0385979bdTim Murray}
1260b575de8ed0b628d84d256f5846500b0385979bdTim Murray
1270b575de8ed0b628d84d256f5846500b0385979bdTim Murray#endif // RS_SERVER
1280b575de8ed0b628d84d256f5846500b0385979bdTim Murray
129326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsnamespace android {
130326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsnamespace renderscript {
131326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
132326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams#if 1
133af12ac6a08651464f8d823add667c706f993b587Steve Block#define rsAssert(v) do {if(!(v)) ALOGE("rsAssert failed: %s, in %s at %i", #v, __FILE__, __LINE__);} while (0)
134326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams#else
135afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk#define rsAssert(v) while (0)
136326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams#endif
137326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
138326e0ddf89e8df2837752fbfd7a014814b32082cJason Samstemplate<typename T>
139326e0ddf89e8df2837752fbfd7a014814b32082cJason SamsT rsMin(T in1, T in2)
140326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
141326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    if (in1 > in2) {
142326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        return in2;
143326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    }
144326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    return in1;
145326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
146326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
147326e0ddf89e8df2837752fbfd7a014814b32082cJason Samstemplate<typename T>
148afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex SakhartchoukT rsMax(T in1, T in2) {
149326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    if (in1 < in2) {
150326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        return in2;
151326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    }
152326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    return in1;
153326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
154326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
155326e0ddf89e8df2837752fbfd7a014814b32082cJason Samstemplate<typename T>
156afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex SakhartchoukT rsFindHighBit(T val) {
157326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    uint32_t bit = 0;
158afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk    while (val > 1) {
159326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        bit++;
160326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        val>>=1;
161326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    }
162326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    return bit;
163326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
164326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
165326e0ddf89e8df2837752fbfd7a014814b32082cJason Samstemplate<typename T>
166afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukbool rsIsPow2(T val) {
167326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    return (val & (val-1)) == 0;
168326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
169326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
170326e0ddf89e8df2837752fbfd7a014814b32082cJason Samstemplate<typename T>
171afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex SakhartchoukT rsHigherPow2(T v) {
172326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    if (rsIsPow2(v)) {
173326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        return v;
174326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    }
175326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    return 1 << (rsFindHighBit(v) + 1);
176326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
177326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
178326e0ddf89e8df2837752fbfd7a014814b32082cJason Samstemplate<typename T>
179afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex SakhartchoukT rsLowerPow2(T v) {
180326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    if (rsIsPow2(v)) {
181326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        return v;
182326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    }
183326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    return 1 << rsFindHighBit(v);
184326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
185326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
18694999c3c7e3dcb6b6c0a9fe5785a0d3216357b0eStephen Hinestemplate<typename T>
18794999c3c7e3dcb6b6c0a9fe5785a0d3216357b0eStephen HinesT rsRound(T v, unsigned int r) {
18894999c3c7e3dcb6b6c0a9fe5785a0d3216357b0eStephen Hines    // Only valid for rounding up to powers of 2.
18994999c3c7e3dcb6b6c0a9fe5785a0d3216357b0eStephen Hines    if ((r & (r - 1)) != 0) {
19094999c3c7e3dcb6b6c0a9fe5785a0d3216357b0eStephen Hines        rsAssert(false && "Must be power of 2 for rounding up");
19194999c3c7e3dcb6b6c0a9fe5785a0d3216357b0eStephen Hines        return v;
19294999c3c7e3dcb6b6c0a9fe5785a0d3216357b0eStephen Hines    }
19394999c3c7e3dcb6b6c0a9fe5785a0d3216357b0eStephen Hines    T res = v + (r - 1);
19494999c3c7e3dcb6b6c0a9fe5785a0d3216357b0eStephen Hines    if (res < v) {
19594999c3c7e3dcb6b6c0a9fe5785a0d3216357b0eStephen Hines        rsAssert(false && "Overflow of rounding operation");
19694999c3c7e3dcb6b6c0a9fe5785a0d3216357b0eStephen Hines        return v;
19794999c3c7e3dcb6b6c0a9fe5785a0d3216357b0eStephen Hines    }
19894999c3c7e3dcb6b6c0a9fe5785a0d3216357b0eStephen Hines    res &= ~(r - 1);
19994999c3c7e3dcb6b6c0a9fe5785a0d3216357b0eStephen Hines    return res;
20094999c3c7e3dcb6b6c0a9fe5785a0d3216357b0eStephen Hines}
20194999c3c7e3dcb6b6c0a9fe5785a0d3216357b0eStephen Hines
202afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukstatic inline uint16_t rs888to565(uint32_t r, uint32_t g, uint32_t b) {
203326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    uint16_t t = 0;
20452a9f5257141322219e4ce48b6980c9d14c80b1bJason Sams    t |= b >> 3;
205326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    t |= (g >> 2) << 5;
20652a9f5257141322219e4ce48b6980c9d14c80b1bJason Sams    t |= (r >> 3) << 11;
207326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    return t;
208326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
209326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
210afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukstatic inline uint16_t rsBoxFilter565(uint16_t i1, uint16_t i2, uint16_t i3, uint16_t i4) {
211326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    uint32_t r = ((i1 & 0x1f) + (i2 & 0x1f) + (i3 & 0x1f) + (i4 & 0x1f));
212565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams    uint32_t g = ((i1 >> 5) & 0x3f) + ((i2 >> 5) & 0x3f) + ((i3 >> 5) & 0x3f) + ((i4 >> 5) & 0x3f);
213326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    uint32_t b = ((i1 >> 11) + (i2 >> 11) + (i3 >> 11) + (i4 >> 11));
214326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    return (r >> 2) | ((g >> 2) << 5) | ((b >> 2) << 11);
215326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
216326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
217afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukstatic inline uint32_t rsBoxFilter8888(uint32_t i1, uint32_t i2, uint32_t i3, uint32_t i4) {
218565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams    uint32_t r = (i1 & 0xff) +         (i2 & 0xff) +         (i3 & 0xff) +         (i4 & 0xff);
219565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams    uint32_t g = ((i1 >> 8) & 0xff) +  ((i2 >> 8) & 0xff) +  ((i3 >> 8) & 0xff) +  ((i4 >> 8) & 0xff);
220565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams    uint32_t b = ((i1 >> 16) & 0xff) + ((i2 >> 16) & 0xff) + ((i3 >> 16) & 0xff) + ((i4 >> 16) & 0xff);
221565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams    uint32_t a = ((i1 >> 24) & 0xff) + ((i2 >> 24) & 0xff) + ((i3 >> 24) & 0xff) + ((i4 >> 24) & 0xff);
222565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams    return (r >> 2) | ((g >> 2) << 8) | ((b >> 2) << 16) | ((a >> 2) << 24);
223565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams}
224326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
225326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
226326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
227326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
228326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams#endif //ANDROID_RS_OBJECT_BASE_H
229326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
230326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
231