1*e1eccf28SAndroid Build Coastguard Worker /*
2*e1eccf28SAndroid Build Coastguard Worker * Copyright (C) 2013 The Android Open Source Project
3*e1eccf28SAndroid Build Coastguard Worker *
4*e1eccf28SAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License");
5*e1eccf28SAndroid Build Coastguard Worker * you may not use this file except in compliance with the License.
6*e1eccf28SAndroid Build Coastguard Worker * You may obtain a copy of the License at
7*e1eccf28SAndroid Build Coastguard Worker *
8*e1eccf28SAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0
9*e1eccf28SAndroid Build Coastguard Worker *
10*e1eccf28SAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software
11*e1eccf28SAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS,
12*e1eccf28SAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*e1eccf28SAndroid Build Coastguard Worker * See the License for the specific language governing permissions and
14*e1eccf28SAndroid Build Coastguard Worker * limitations under the License.
15*e1eccf28SAndroid Build Coastguard Worker */
16*e1eccf28SAndroid Build Coastguard Worker
17*e1eccf28SAndroid Build Coastguard Worker #ifndef ANDROID_RS_CPP_UTILS_H
18*e1eccf28SAndroid Build Coastguard Worker #define ANDROID_RS_CPP_UTILS_H
19*e1eccf28SAndroid Build Coastguard Worker
20*e1eccf28SAndroid Build Coastguard Worker #include <stdint.h>
21*e1eccf28SAndroid Build Coastguard Worker #include <stdlib.h>
22*e1eccf28SAndroid Build Coastguard Worker #include <pthread.h>
23*e1eccf28SAndroid Build Coastguard Worker #include <time.h>
24*e1eccf28SAndroid Build Coastguard Worker #include <math.h>
25*e1eccf28SAndroid Build Coastguard Worker
26*e1eccf28SAndroid Build Coastguard Worker #include <string>
27*e1eccf28SAndroid Build Coastguard Worker #include <vector>
28*e1eccf28SAndroid Build Coastguard Worker #include <algorithm>
29*e1eccf28SAndroid Build Coastguard Worker
30*e1eccf28SAndroid Build Coastguard Worker #include <android/log.h>
31*e1eccf28SAndroid Build Coastguard Worker #include <sys/system_properties.h>
32*e1eccf28SAndroid Build Coastguard Worker
33*e1eccf28SAndroid Build Coastguard Worker #ifndef ALOGE
34*e1eccf28SAndroid Build Coastguard Worker #define ALOGE(...) \
35*e1eccf28SAndroid Build Coastguard Worker __android_log_print(ANDROID_LOG_ERROR, LOG_TAG, __VA_ARGS__);
36*e1eccf28SAndroid Build Coastguard Worker #endif
37*e1eccf28SAndroid Build Coastguard Worker #ifndef ALOGW
38*e1eccf28SAndroid Build Coastguard Worker #define ALOGW(...) \
39*e1eccf28SAndroid Build Coastguard Worker __android_log_print(ANDROID_LOG_WARN, LOG_TAG, __VA_ARGS__);
40*e1eccf28SAndroid Build Coastguard Worker #endif
41*e1eccf28SAndroid Build Coastguard Worker #ifndef ALOGD
42*e1eccf28SAndroid Build Coastguard Worker #define ALOGD(...) \
43*e1eccf28SAndroid Build Coastguard Worker __android_log_print(ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__);
44*e1eccf28SAndroid Build Coastguard Worker #endif
45*e1eccf28SAndroid Build Coastguard Worker #ifndef ALOGV
46*e1eccf28SAndroid Build Coastguard Worker #define ALOGV(...) \
47*e1eccf28SAndroid Build Coastguard Worker __android_log_print(ANDROID_LOG_VERBOSE, LOG_TAG, __VA_ARGS__);
48*e1eccf28SAndroid Build Coastguard Worker #endif
49*e1eccf28SAndroid Build Coastguard Worker
50*e1eccf28SAndroid Build Coastguard Worker #if defined(_WIN32)
51*e1eccf28SAndroid Build Coastguard Worker #define OS_PATH_SEPARATOR '\\'
52*e1eccf28SAndroid Build Coastguard Worker #else
53*e1eccf28SAndroid Build Coastguard Worker #define OS_PATH_SEPARATOR '/'
54*e1eccf28SAndroid Build Coastguard Worker #endif
55*e1eccf28SAndroid Build Coastguard Worker
56*e1eccf28SAndroid Build Coastguard Worker
57*e1eccf28SAndroid Build Coastguard Worker namespace android {
58*e1eccf28SAndroid Build Coastguard Worker namespace renderscript {
59*e1eccf28SAndroid Build Coastguard Worker
60*e1eccf28SAndroid Build Coastguard Worker typedef int64_t nsecs_t; // nano-seconds
61*e1eccf28SAndroid Build Coastguard Worker
62*e1eccf28SAndroid Build Coastguard Worker enum {
63*e1eccf28SAndroid Build Coastguard Worker SYSTEM_TIME_REALTIME = 0, // system-wide realtime clock
64*e1eccf28SAndroid Build Coastguard Worker SYSTEM_TIME_MONOTONIC = 1, // monotonic time since unspecified starting point
65*e1eccf28SAndroid Build Coastguard Worker SYSTEM_TIME_PROCESS = 2, // high-resolution per-process clock
66*e1eccf28SAndroid Build Coastguard Worker SYSTEM_TIME_THREAD = 3, // high-resolution per-thread clock
67*e1eccf28SAndroid Build Coastguard Worker };
68*e1eccf28SAndroid Build Coastguard Worker
systemTime(int clock)69*e1eccf28SAndroid Build Coastguard Worker static inline nsecs_t systemTime(int clock)
70*e1eccf28SAndroid Build Coastguard Worker {
71*e1eccf28SAndroid Build Coastguard Worker #if defined(__linux__)
72*e1eccf28SAndroid Build Coastguard Worker static const clockid_t clocks[] = {
73*e1eccf28SAndroid Build Coastguard Worker CLOCK_REALTIME,
74*e1eccf28SAndroid Build Coastguard Worker CLOCK_MONOTONIC,
75*e1eccf28SAndroid Build Coastguard Worker CLOCK_PROCESS_CPUTIME_ID,
76*e1eccf28SAndroid Build Coastguard Worker CLOCK_THREAD_CPUTIME_ID
77*e1eccf28SAndroid Build Coastguard Worker };
78*e1eccf28SAndroid Build Coastguard Worker struct timespec t;
79*e1eccf28SAndroid Build Coastguard Worker t.tv_sec = t.tv_nsec = 0;
80*e1eccf28SAndroid Build Coastguard Worker clock_gettime(clocks[clock], &t);
81*e1eccf28SAndroid Build Coastguard Worker return nsecs_t(t.tv_sec)*1000000000LL + t.tv_nsec;
82*e1eccf28SAndroid Build Coastguard Worker #else
83*e1eccf28SAndroid Build Coastguard Worker // we don't support the clocks here.
84*e1eccf28SAndroid Build Coastguard Worker struct timeval t;
85*e1eccf28SAndroid Build Coastguard Worker t.tv_sec = t.tv_usec = 0;
86*e1eccf28SAndroid Build Coastguard Worker gettimeofday(&t, nullptr);
87*e1eccf28SAndroid Build Coastguard Worker return nsecs_t(t.tv_sec)*1000000000LL + nsecs_t(t.tv_usec)*1000LL;
88*e1eccf28SAndroid Build Coastguard Worker #endif
89*e1eccf28SAndroid Build Coastguard Worker }
90*e1eccf28SAndroid Build Coastguard Worker
nanoseconds_to_milliseconds(nsecs_t secs)91*e1eccf28SAndroid Build Coastguard Worker static inline nsecs_t nanoseconds_to_milliseconds(nsecs_t secs)
92*e1eccf28SAndroid Build Coastguard Worker {
93*e1eccf28SAndroid Build Coastguard Worker return secs/1000000;
94*e1eccf28SAndroid Build Coastguard Worker }
95*e1eccf28SAndroid Build Coastguard Worker
96*e1eccf28SAndroid Build Coastguard Worker #if 1
97*e1eccf28SAndroid Build Coastguard Worker #define rsAssert(v) do {if(!(v)) ALOGE("rsAssert failed: %s, in %s at %i", #v, __FILE__, __LINE__);} while (0)
98*e1eccf28SAndroid Build Coastguard Worker #else
99*e1eccf28SAndroid Build Coastguard Worker #define rsAssert(v) while (0)
100*e1eccf28SAndroid Build Coastguard Worker #endif
101*e1eccf28SAndroid Build Coastguard Worker
102*e1eccf28SAndroid Build Coastguard Worker template<typename T>
rsMin(T in1,T in2)103*e1eccf28SAndroid Build Coastguard Worker T rsMin(T in1, T in2)
104*e1eccf28SAndroid Build Coastguard Worker {
105*e1eccf28SAndroid Build Coastguard Worker if (in1 > in2) {
106*e1eccf28SAndroid Build Coastguard Worker return in2;
107*e1eccf28SAndroid Build Coastguard Worker }
108*e1eccf28SAndroid Build Coastguard Worker return in1;
109*e1eccf28SAndroid Build Coastguard Worker }
110*e1eccf28SAndroid Build Coastguard Worker
111*e1eccf28SAndroid Build Coastguard Worker template<typename T>
rsMax(T in1,T in2)112*e1eccf28SAndroid Build Coastguard Worker T rsMax(T in1, T in2) {
113*e1eccf28SAndroid Build Coastguard Worker if (in1 < in2) {
114*e1eccf28SAndroid Build Coastguard Worker return in2;
115*e1eccf28SAndroid Build Coastguard Worker }
116*e1eccf28SAndroid Build Coastguard Worker return in1;
117*e1eccf28SAndroid Build Coastguard Worker }
118*e1eccf28SAndroid Build Coastguard Worker
119*e1eccf28SAndroid Build Coastguard Worker template<typename T>
rsFindHighBit(T val)120*e1eccf28SAndroid Build Coastguard Worker T rsFindHighBit(T val) {
121*e1eccf28SAndroid Build Coastguard Worker uint32_t bit = 0;
122*e1eccf28SAndroid Build Coastguard Worker while (val > 1) {
123*e1eccf28SAndroid Build Coastguard Worker bit++;
124*e1eccf28SAndroid Build Coastguard Worker val>>=1;
125*e1eccf28SAndroid Build Coastguard Worker }
126*e1eccf28SAndroid Build Coastguard Worker return bit;
127*e1eccf28SAndroid Build Coastguard Worker }
128*e1eccf28SAndroid Build Coastguard Worker
129*e1eccf28SAndroid Build Coastguard Worker template<typename T>
rsIsPow2(T val)130*e1eccf28SAndroid Build Coastguard Worker bool rsIsPow2(T val) {
131*e1eccf28SAndroid Build Coastguard Worker return (val & (val-1)) == 0;
132*e1eccf28SAndroid Build Coastguard Worker }
133*e1eccf28SAndroid Build Coastguard Worker
134*e1eccf28SAndroid Build Coastguard Worker template<typename T>
rsHigherPow2(T v)135*e1eccf28SAndroid Build Coastguard Worker T rsHigherPow2(T v) {
136*e1eccf28SAndroid Build Coastguard Worker if (rsIsPow2(v)) {
137*e1eccf28SAndroid Build Coastguard Worker return v;
138*e1eccf28SAndroid Build Coastguard Worker }
139*e1eccf28SAndroid Build Coastguard Worker return 1 << (rsFindHighBit(v) + 1);
140*e1eccf28SAndroid Build Coastguard Worker }
141*e1eccf28SAndroid Build Coastguard Worker
142*e1eccf28SAndroid Build Coastguard Worker template<typename T>
rsLowerPow2(T v)143*e1eccf28SAndroid Build Coastguard Worker T rsLowerPow2(T v) {
144*e1eccf28SAndroid Build Coastguard Worker if (rsIsPow2(v)) {
145*e1eccf28SAndroid Build Coastguard Worker return v;
146*e1eccf28SAndroid Build Coastguard Worker }
147*e1eccf28SAndroid Build Coastguard Worker return 1 << rsFindHighBit(v);
148*e1eccf28SAndroid Build Coastguard Worker }
149*e1eccf28SAndroid Build Coastguard Worker
150*e1eccf28SAndroid Build Coastguard Worker template<typename T>
rsRound(T v,unsigned int r)151*e1eccf28SAndroid Build Coastguard Worker T rsRound(T v, unsigned int r) {
152*e1eccf28SAndroid Build Coastguard Worker // Only valid for rounding up to powers of 2.
153*e1eccf28SAndroid Build Coastguard Worker if ((r & (r - 1)) != 0) {
154*e1eccf28SAndroid Build Coastguard Worker rsAssert(false && "Must be power of 2 for rounding up");
155*e1eccf28SAndroid Build Coastguard Worker return v;
156*e1eccf28SAndroid Build Coastguard Worker }
157*e1eccf28SAndroid Build Coastguard Worker T res = v + (r - 1);
158*e1eccf28SAndroid Build Coastguard Worker if (res < v) {
159*e1eccf28SAndroid Build Coastguard Worker rsAssert(false && "Overflow of rounding operation");
160*e1eccf28SAndroid Build Coastguard Worker return v;
161*e1eccf28SAndroid Build Coastguard Worker }
162*e1eccf28SAndroid Build Coastguard Worker res &= ~(r - 1);
163*e1eccf28SAndroid Build Coastguard Worker return res;
164*e1eccf28SAndroid Build Coastguard Worker }
165*e1eccf28SAndroid Build Coastguard Worker
rs888to565(uint32_t r,uint32_t g,uint32_t b)166*e1eccf28SAndroid Build Coastguard Worker static inline uint16_t rs888to565(uint32_t r, uint32_t g, uint32_t b) {
167*e1eccf28SAndroid Build Coastguard Worker uint16_t t = 0;
168*e1eccf28SAndroid Build Coastguard Worker t |= b >> 3;
169*e1eccf28SAndroid Build Coastguard Worker t |= (g >> 2) << 5;
170*e1eccf28SAndroid Build Coastguard Worker t |= (r >> 3) << 11;
171*e1eccf28SAndroid Build Coastguard Worker return t;
172*e1eccf28SAndroid Build Coastguard Worker }
173*e1eccf28SAndroid Build Coastguard Worker
rsBoxFilter565(uint16_t i1,uint16_t i2,uint16_t i3,uint16_t i4)174*e1eccf28SAndroid Build Coastguard Worker static inline uint16_t rsBoxFilter565(uint16_t i1, uint16_t i2, uint16_t i3, uint16_t i4) {
175*e1eccf28SAndroid Build Coastguard Worker uint32_t r = ((i1 & 0x1f) + (i2 & 0x1f) + (i3 & 0x1f) + (i4 & 0x1f));
176*e1eccf28SAndroid Build Coastguard Worker uint32_t g = ((i1 >> 5) & 0x3f) + ((i2 >> 5) & 0x3f) + ((i3 >> 5) & 0x3f) + ((i4 >> 5) & 0x3f);
177*e1eccf28SAndroid Build Coastguard Worker uint32_t b = ((i1 >> 11) + (i2 >> 11) + (i3 >> 11) + (i4 >> 11));
178*e1eccf28SAndroid Build Coastguard Worker return (r >> 2) | ((g >> 2) << 5) | ((b >> 2) << 11);
179*e1eccf28SAndroid Build Coastguard Worker }
180*e1eccf28SAndroid Build Coastguard Worker
rsBoxFilter8888(uint32_t i1,uint32_t i2,uint32_t i3,uint32_t i4)181*e1eccf28SAndroid Build Coastguard Worker static inline uint32_t rsBoxFilter8888(uint32_t i1, uint32_t i2, uint32_t i3, uint32_t i4) {
182*e1eccf28SAndroid Build Coastguard Worker uint32_t r = (i1 & 0xff) + (i2 & 0xff) + (i3 & 0xff) + (i4 & 0xff);
183*e1eccf28SAndroid Build Coastguard Worker uint32_t g = ((i1 >> 8) & 0xff) + ((i2 >> 8) & 0xff) + ((i3 >> 8) & 0xff) + ((i4 >> 8) & 0xff);
184*e1eccf28SAndroid Build Coastguard Worker uint32_t b = ((i1 >> 16) & 0xff) + ((i2 >> 16) & 0xff) + ((i3 >> 16) & 0xff) + ((i4 >> 16) & 0xff);
185*e1eccf28SAndroid Build Coastguard Worker uint32_t a = ((i1 >> 24) & 0xff) + ((i2 >> 24) & 0xff) + ((i3 >> 24) & 0xff) + ((i4 >> 24) & 0xff);
186*e1eccf28SAndroid Build Coastguard Worker return (r >> 2) | ((g >> 2) << 8) | ((b >> 2) << 16) | ((a >> 2) << 24);
187*e1eccf28SAndroid Build Coastguard Worker }
188*e1eccf28SAndroid Build Coastguard Worker
189*e1eccf28SAndroid Build Coastguard Worker const char * rsuCopyString(const char *name);
190*e1eccf28SAndroid Build Coastguard Worker const char * rsuCopyString(const char *name, size_t len);
191*e1eccf28SAndroid Build Coastguard Worker const char* rsuJoinStrings(int n, const char* const* strs);
192*e1eccf28SAndroid Build Coastguard Worker
193*e1eccf28SAndroid Build Coastguard Worker #ifndef RS_COMPATIBILITY_LIB
194*e1eccf28SAndroid Build Coastguard Worker // Utility to fork/exec a command.
195*e1eccf28SAndroid Build Coastguard Worker // exe - Command to execute
196*e1eccf28SAndroid Build Coastguard Worker // nArgs - Number of arguments (excluding the trailing nullptr in args)
197*e1eccf28SAndroid Build Coastguard Worker // args - Arguments to the command
198*e1eccf28SAndroid Build Coastguard Worker bool rsuExecuteCommand(const char *exe, int nArgs, const char * const *args);
199*e1eccf28SAndroid Build Coastguard Worker #endif
200*e1eccf28SAndroid Build Coastguard Worker
201*e1eccf28SAndroid Build Coastguard Worker int property_get(const char *key, char *value, const char *default_value);
202*e1eccf28SAndroid Build Coastguard Worker
203*e1eccf28SAndroid Build Coastguard Worker } // namespace renderscript
204*e1eccf28SAndroid Build Coastguard Worker } // namespace android
205*e1eccf28SAndroid Build Coastguard Worker
206*e1eccf28SAndroid Build Coastguard Worker #endif //ANDROID_RS_OBJECT_BASE_H
207*e1eccf28SAndroid Build Coastguard Worker
208*e1eccf28SAndroid Build Coastguard Worker
209