rsCppUtils.h revision 43cfc0cbe6e6e8f585a0ae5f1d9cc2859ab1dda7
14aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy/*
24aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy * Copyright (C) 2013 The Android Open Source Project
34aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy *
44aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy * Licensed under the Apache License, Version 2.0 (the "License");
54aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy * you may not use this file except in compliance with the License.
64aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy * You may obtain a copy of the License at
74aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy *
84aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy *      http://www.apache.org/licenses/LICENSE-2.0
94aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy *
104aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy * Unless required by applicable law or agreed to in writing, software
114aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy * distributed under the License is distributed on an "AS IS" BASIS,
124aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
134aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy * See the License for the specific language governing permissions and
144aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy * limitations under the License.
154aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy */
164aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
174aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy#ifndef ANDROID_RS_CPP_UTILS_H
184aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy#define ANDROID_RS_CPP_UTILS_H
19d5a85fb63d91a9297e8d9a11016f3b3ed60dfbabRomain Guy
20c46d07a29e94807e768f8b162ce9f77a88ba6f46Romain Guy#if !defined(RS_SERVER) && !defined(RS_COMPATIBILITY_LIB)
219c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase#include <utils/Log.h>
226554943a1dd6854c0f4976900956e556767b49e1Romain Guy#include <utils/String8.h>
236554943a1dd6854c0f4976900956e556767b49e1Romain Guy#include <utils/Vector.h>
24113e0824d6bddf4376240681f9cf6a2deded9498John Reck#include <cutils/atomic.h>
25c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craik#endif
269c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase
272af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik#include <stdint.h>
284aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
29113e0824d6bddf4376240681f9cf6a2deded9498John Reck#include <stdlib.h>
3013631f3da855f200a151e7837ed9f6b079622b58Romain Guy#include <pthread.h>
314aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy#include <time.h>
324aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
334aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy#include <math.h>
34cce47eb580d666ead1f6095d1e3b65233592bbaaChris Craik
35cce47eb580d666ead1f6095d1e3b65233592bbaaChris Craik#ifdef RS_COMPATIBILITY_LIB
36cce47eb580d666ead1f6095d1e3b65233592bbaaChris Craik#include <android/log.h>
37cce47eb580d666ead1f6095d1e3b65233592bbaaChris Craik#endif
38cce47eb580d666ead1f6095d1e3b65233592bbaaChris Craik
39cce47eb580d666ead1f6095d1e3b65233592bbaaChris Craik#if defined(RS_SERVER) || defined(RS_COMPATIBILITY_LIB)
40cce47eb580d666ead1f6095d1e3b65233592bbaaChris Craik
41cce47eb580d666ead1f6095d1e3b65233592bbaaChris Craik#include <string>
424aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy#include <vector>
434aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy#include <algorithm>
444aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
4544fd8d24f761f82d21e9b00932648a1b6bf91449John Reck#define ALOGE(...) \
4644fd8d24f761f82d21e9b00932648a1b6bf91449John Reck    __android_log_print(ANDROID_LOG_ERROR, LOG_TAG, __VA_ARGS__);
474aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy#define ALOGW(...) \
484aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    __android_log_print(ANDROID_LOG_WARN, LOG_TAG, __VA_ARGS__);
4944fd8d24f761f82d21e9b00932648a1b6bf91449John Reck#define ALOGD(...) \
5044fd8d24f761f82d21e9b00932648a1b6bf91449John Reck    __android_log_print(ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__);
5144fd8d24f761f82d21e9b00932648a1b6bf91449John Reck#define ALOGV(...) \
52d34dd71800d9a1077e58c3b7f2511c46848da417Chet Haase    __android_log_print(ANDROID_LOG_VERBOSE, LOG_TAG, __VA_ARGS__);
5344fd8d24f761f82d21e9b00932648a1b6bf91449John Reck
5443ccf4663c822ddd435b7683cc05221f6169c6c3Romain Guynamespace android {
55735738c4ddf3229caa5f6e634bf591953ac29944Romain Guy
562fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy    // server has no Vector or String8 classes; implement on top of STL
5744fd8d24f761f82d21e9b00932648a1b6bf91449John Reck    class String8: public std::string {
5844fd8d24f761f82d21e9b00932648a1b6bf91449John Reck    public:
5944fd8d24f761f82d21e9b00932648a1b6bf91449John Reck    String8(const char *ptr) : std::string(ptr) {
605977baa1fa24125c148a72699b53e62abaf08960Chet Haase
615977baa1fa24125c148a72699b53e62abaf08960Chet Haase        }
627c25aab491707f7324f9941b8cfa9bd2b4b97e76Romain Guy    String8(const char *ptr, size_t len) : std::string(ptr, len) {
637d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guy
6444fd8d24f761f82d21e9b00932648a1b6bf91449John Reck        }
6544fd8d24f761f82d21e9b00932648a1b6bf91449John Reck    String8() : std::string() {
6644fd8d24f761f82d21e9b00932648a1b6bf91449John Reck
6744fd8d24f761f82d21e9b00932648a1b6bf91449John Reck        }
6844fd8d24f761f82d21e9b00932648a1b6bf91449John Reck
6914e513058ed4168c94e015638d16f5f87fd8063aChris Craik        const char* string() const {
7045e4c3df6c00ac98ff6144de9af574877d4fff19Romain Guy            return this->c_str();
7145e4c3df6c00ac98ff6144de9af574877d4fff19Romain Guy        }
7227454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy
7345e4c3df6c00ac98ff6144de9af574877d4fff19Romain Guy        void setTo(const char* str, ssize_t len) {
7444b2fe3fc114ee5f7273c6b0fee2cc999bf244a2Chet Haase            this->assign(str, len);
7527454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy        }
7627454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy        void setTo(const char* str) {
7727454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy            this->assign(str);
7827454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy        }
792af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik        String8 getPathDir(void) const {
80b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            const char* cp;
81b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            const char*const str = this->c_str();
82daf98e941e140e8739458126640183b9f296a2abChet Haase
83daf98e941e140e8739458126640183b9f296a2abChet Haase            cp = strrchr(str, OS_PATH_SEPARATOR);
84daf98e941e140e8739458126640183b9f296a2abChet Haase            if (cp == NULL)
852b1847ea60650a9f68372abe860415f18b55081dRomain Guy                return String8("");
864aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy            else
874aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy                return String8(str, cp - str);
886554943a1dd6854c0f4976900956e556767b49e1Romain Guy        }
89cabfcc1364eb7e4de0b15b3574fba45027b45cfcRomain Guy    };
902af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik
9144fd8d24f761f82d21e9b00932648a1b6bf91449John Reck    template <class T> class Vector: public std::vector<T> {
926554943a1dd6854c0f4976900956e556767b49e1Romain Guy    public:
93daf98e941e140e8739458126640183b9f296a2abChet Haase        void push(T obj) {
94daf98e941e140e8739458126640183b9f296a2abChet Haase            this->push_back(obj);
954aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        }
962af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik        void removeAt(uint32_t index) {
9714e513058ed4168c94e015638d16f5f87fd8063aChris Craik            this->erase(this->begin() + index);
984aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        }
994aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        ssize_t add(const T& obj) {
1004aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy            this->push_back(obj);
10104c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy            return this->size() - 1;
10233f6beb10f98e8ba96250e284876d607055d278dRomain Guy        }
10333f6beb10f98e8ba96250e284876d607055d278dRomain Guy        void setCapacity(ssize_t capacity) {
10404c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy            this->resize(capacity);
10533f6beb10f98e8ba96250e284876d607055d278dRomain Guy        }
10633f6beb10f98e8ba96250e284876d607055d278dRomain Guy
1072af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik        T* editArray() {
10814e513058ed4168c94e015638d16f5f87fd8063aChris Craik            return (T*)(this->begin());
1094aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        }
1104aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
1114aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        const T* array() {
11227454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy            return (const T*)(this->begin());
1132af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik        }
11414e513058ed4168c94e015638d16f5f87fd8063aChris Craik
1154aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    };
1164aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
1174aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    template<> class Vector<bool>: public std::vector<char> {
118d44fbe55a9f434cb5bb0e34c143ba1445141990dDerek Sollenberger    public:
119d44fbe55a9f434cb5bb0e34c143ba1445141990dDerek Sollenberger        void push(bool obj) {
120d44fbe55a9f434cb5bb0e34c143ba1445141990dDerek Sollenberger            this->push_back(obj);
12114e513058ed4168c94e015638d16f5f87fd8063aChris Craik        }
1225b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy        void removeAt(uint32_t index) {
1235b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy            this->erase(this->begin() + index);
124b458942bb6e6cf13c68341dda35ef5cee060f5aeChris Craik        }
125b458942bb6e6cf13c68341dda35ef5cee060f5aeChris Craik        ssize_t add(const bool& obj) {
12633f6beb10f98e8ba96250e284876d607055d278dRomain Guy            this->push_back(obj);
12733f6beb10f98e8ba96250e284876d607055d278dRomain Guy            return this->size() - 1;
12833f6beb10f98e8ba96250e284876d607055d278dRomain Guy        }
12933f6beb10f98e8ba96250e284876d607055d278dRomain Guy        void setCapacity(ssize_t capacity) {
13014e513058ed4168c94e015638d16f5f87fd8063aChris Craik            this->resize(capacity);
1314aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        }
1324aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
1334aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        bool* editArray() {
1342af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik            return (bool*)(this->begin());
13514e513058ed4168c94e015638d16f5f87fd8063aChris Craik        }
1364aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
1374aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        const bool* array() {
1384aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy            return (const bool*)(this->begin());
1392af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik        }
14014e513058ed4168c94e015638d16f5f87fd8063aChris Craik    };
1414aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
1424aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
143807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guy
1442af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craiktypedef int64_t nsecs_t;  // nano-seconds
14514e513058ed4168c94e015638d16f5f87fd8063aChris Craik
146807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guyenum {
147807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guy    SYSTEM_TIME_REALTIME = 0,  // system-wide realtime clock
148139088228faa7f3c446af7387e017933998a5570Derek Sollenberger    SYSTEM_TIME_MONOTONIC = 1, // monotonic time since unspecified starting point
1492af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik    SYSTEM_TIME_PROCESS = 2,   // high-resolution per-process clock
15014e513058ed4168c94e015638d16f5f87fd8063aChris Craik    SYSTEM_TIME_THREAD = 3,    // high-resolution per-thread clock
1514aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy};
1524aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
153139088228faa7f3c446af7387e017933998a5570Derek Sollenbergerstatic inline nsecs_t systemTime(int clock)
1542af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik{
15514e513058ed4168c94e015638d16f5f87fd8063aChris Craik#if defined(HAVE_POSIX_CLOCKS)
1564aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    static const clockid_t clocks[] = {
1574aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy            CLOCK_REALTIME,
1584aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy            CLOCK_MONOTONIC,
1594aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy            CLOCK_PROCESS_CPUTIME_ID,
1602af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik            CLOCK_THREAD_CPUTIME_ID
161d6b65f67717025b1162f86f04e2caa5723566cacChris Craik    };
1624aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    struct timespec t;
1634aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    t.tv_sec = t.tv_nsec = 0;
164d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik    clock_gettime(clocks[clock], &t);
1652af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik    return nsecs_t(t.tv_sec)*1000000000LL + t.tv_nsec;
1662af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik#else
167d6b65f67717025b1162f86f04e2caa5723566cacChris Craik    // we don't support the clocks here.
168735738c4ddf3229caa5f6e634bf591953ac29944Romain Guy    struct timeval t;
169735738c4ddf3229caa5f6e634bf591953ac29944Romain Guy    t.tv_sec = t.tv_usec = 0;
170d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik    gettimeofday(&t, NULL);
1712af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik    return nsecs_t(t.tv_sec)*1000000000LL + nsecs_t(t.tv_usec)*1000LL;
1722af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik#endif
173d6b65f67717025b1162f86f04e2caa5723566cacChris Craik}
174735738c4ddf3229caa5f6e634bf591953ac29944Romain Guy
175735738c4ddf3229caa5f6e634bf591953ac29944Romain Guystatic inline nsecs_t nanoseconds_to_milliseconds(nsecs_t secs)
176a7090e0cfd7c719a6d4c03aae34f5db98754cbddChris Craik{
177cabfcc1364eb7e4de0b15b3574fba45027b45cfcRomain Guy    return secs/1000000;
178cabfcc1364eb7e4de0b15b3574fba45027b45cfcRomain Guy}
179b85967b9af76e1e60f7a96603e2567a6449d2e04Chet Haase
180a7090e0cfd7c719a6d4c03aae34f5db98754cbddChris Craik
1813f085429fd47ebd32ac2463b3eae2a5a6c17be25Chris Craik#endif // RS_SERVER || RS_COMPATIBILITY_LIB
1823f085429fd47ebd32ac2463b3eae2a5a6c17be25Chris Craik
1833f085429fd47ebd32ac2463b3eae2a5a6c17be25Chris Craiknamespace android {
1842af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craiknamespace renderscript {
185a7090e0cfd7c719a6d4c03aae34f5db98754cbddChris Craik
186f57776b2d195f0937906eb88b777bb55ccc36967Chris Craik#if 1
187087bc0c14bdccf7c258dce0cdef46a69a839b427John Reck#define rsAssert(v) do {if(!(v)) ALOGE("rsAssert failed: %s, in %s at %i", #v, __FILE__, __LINE__);} while (0)
1886554943a1dd6854c0f4976900956e556767b49e1Romain Guy#else
1890fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy#define rsAssert(v) while (0)
1900fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy#endif
191a08f95cfeca7217f9c533b03663bf0dceedd259aChris Craik
192ce4a7dfc516ee61301e9af91fad17ca1320efaabRomain Guytemplate<typename T>
193a08f95cfeca7217f9c533b03663bf0dceedd259aChris CraikT rsMin(T in1, T in2)
194486590963e2207d68eebd6944fec70d50d41116aChet Haase{
1956c319ca1275c8db892c39b48fc54864c949f9171Romain Guy    if (in1 > in2) {
1966c319ca1275c8db892c39b48fc54864c949f9171Romain Guy        return in2;
197d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik    }
198d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik    return in1;
1992af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik}
2002af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik
2012af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craiktemplate<typename T>
20255b6f95ee4ace96c97508bcd14483fb4e9dbeaa0Romain GuyT rsMax(T in1, T in2) {
203486590963e2207d68eebd6944fec70d50d41116aChet Haase    if (in1 < in2) {
2044aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        return in2;
2054aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    }
206139088228faa7f3c446af7387e017933998a5570Derek Sollenberger    return in1;
207d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik}
2082af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik
2092af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craiktemplate<typename T>
2102af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris CraikT rsFindHighBit(T val) {
2112af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik    uint32_t bit = 0;
212486590963e2207d68eebd6944fec70d50d41116aChet Haase    while (val > 1) {
2134aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        bit++;
2144aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        val>>=1;
215d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik    }
2164aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    return bit;
217d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik}
2182af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik
2192af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craiktemplate<typename T>
2202af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craikbool rsIsPow2(T val) {
221527a3aace1dd72432c2e0472a570e030ad04bf16Chris Craik    return (val & (val-1)) == 0;
222527a3aace1dd72432c2e0472a570e030ad04bf16Chris Craik}
223527a3aace1dd72432c2e0472a570e030ad04bf16Chris Craik
224527a3aace1dd72432c2e0472a570e030ad04bf16Chris Craiktemplate<typename T>
225527a3aace1dd72432c2e0472a570e030ad04bf16Chris CraikT rsHigherPow2(T v) {
22655b6f95ee4ace96c97508bcd14483fb4e9dbeaa0Romain Guy    if (rsIsPow2(v)) {
227527a3aace1dd72432c2e0472a570e030ad04bf16Chris Craik        return v;
228527a3aace1dd72432c2e0472a570e030ad04bf16Chris Craik    }
229527a3aace1dd72432c2e0472a570e030ad04bf16Chris Craik    return 1 << (rsFindHighBit(v) + 1);
2302af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik}
2312af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik
2322af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craiktemplate<typename T>
233486590963e2207d68eebd6944fec70d50d41116aChet HaaseT rsLowerPow2(T v) {
2344aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    if (rsIsPow2(v)) {
2354aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        return v;
236d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik    }
237d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik    return 1 << rsFindHighBit(v);
2382af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik}
2392af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik
2402af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craiktemplate<typename T>
2412af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris CraikT rsRound(T v, unsigned int r) {
242486590963e2207d68eebd6944fec70d50d41116aChet Haase    // Only valid for rounding up to powers of 2.
243e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy    if ((r & (r - 1)) != 0) {
244e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy        rsAssert(false && "Must be power of 2 for rounding up");
245d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik        return v;
246d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik    }
2470664fef9e2a36025b3fad85b57b4d10617b4d66eChris Craik    T res = v + (r - 1);
2482af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik    if (res < v) {
2490664fef9e2a36025b3fad85b57b4d10617b4d66eChris Craik        rsAssert(false && "Overflow of rounding operation");
2502af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik        return v;
2510664fef9e2a36025b3fad85b57b4d10617b4d66eChris Craik    }
2522af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik    res &= ~(r - 1);
2532af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik    return res;
2542af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik}
255486590963e2207d68eebd6944fec70d50d41116aChet Haase
2565a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guystatic inline uint16_t rs888to565(uint32_t r, uint32_t g, uint32_t b) {
2575a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy    uint16_t t = 0;
258d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik    t |= b >> 3;
259d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik    t |= (g >> 2) << 5;
2602af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik    t |= (r >> 3) << 11;
261e3b0a0117a2ab4118f868a731b238fe8f2430276Romain Guy    return t;
26216ea8d373b03b1e115dd505af70dbee4e3a3a182Romain Guy}
2632af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik
26403c00b5a135e68d22ca5bb829b899ebda6ed7e9dRomain Guystatic inline uint16_t rsBoxFilter565(uint16_t i1, uint16_t i2, uint16_t i3, uint16_t i4) {
265486590963e2207d68eebd6944fec70d50d41116aChet Haase    uint32_t r = ((i1 & 0x1f) + (i2 & 0x1f) + (i3 & 0x1f) + (i4 & 0x1f));
2664aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    uint32_t g = ((i1 >> 5) & 0x3f) + ((i2 >> 5) & 0x3f) + ((i3 >> 5) & 0x3f) + ((i4 >> 5) & 0x3f);
2674aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    uint32_t b = ((i1 >> 11) + (i2 >> 11) + (i3 >> 11) + (i4 >> 11));
268486590963e2207d68eebd6944fec70d50d41116aChet Haase    return (r >> 2) | ((g >> 2) << 5) | ((b >> 2) << 11);
2692af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik}
270486590963e2207d68eebd6944fec70d50d41116aChet Haase
2714aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guystatic inline uint32_t rsBoxFilter8888(uint32_t i1, uint32_t i2, uint32_t i3, uint32_t i4) {
2724aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    uint32_t r = (i1 & 0xff) +         (i2 & 0xff) +         (i3 & 0xff) +         (i4 & 0xff);
273486590963e2207d68eebd6944fec70d50d41116aChet Haase    uint32_t g = ((i1 >> 8) & 0xff) +  ((i2 >> 8) & 0xff) +  ((i3 >> 8) & 0xff) +  ((i4 >> 8) & 0xff);
274d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik    uint32_t b = ((i1 >> 16) & 0xff) + ((i2 >> 16) & 0xff) + ((i3 >> 16) & 0xff) + ((i4 >> 16) & 0xff);
2752af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik    uint32_t a = ((i1 >> 24) & 0xff) + ((i2 >> 24) & 0xff) + ((i3 >> 24) & 0xff) + ((i4 >> 24) & 0xff);
2762af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik    return (r >> 2) | ((g >> 2) << 8) | ((b >> 2) << 16) | ((a >> 2) << 24);
277486590963e2207d68eebd6944fec70d50d41116aChet Haase}
2784aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
2794aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
280486590963e2207d68eebd6944fec70d50d41116aChet Haase}
281d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik
2822af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik#endif //ANDROID_RS_OBJECT_BASE_H
2832af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik
284486590963e2207d68eebd6944fec70d50d41116aChet Haase
28501d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy