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