rsAnimation.cpp revision fb6b614bcea88a587a7ea4530be45ff0ffa0210e
1a89371c6f144b9049efe7689105feee2c4a38384Jason Sams/* 2a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk * Copyright (C) 2009 The Android Open Source Project 3a89371c6f144b9049efe7689105feee2c4a38384Jason Sams * 4a89371c6f144b9049efe7689105feee2c4a38384Jason Sams * Licensed under the Apache License, Version 2.0 (the "License"); 5a89371c6f144b9049efe7689105feee2c4a38384Jason Sams * you may not use this file except in compliance with the License. 6a89371c6f144b9049efe7689105feee2c4a38384Jason Sams * You may obtain a copy of the License at 7a89371c6f144b9049efe7689105feee2c4a38384Jason Sams * 8a89371c6f144b9049efe7689105feee2c4a38384Jason Sams * http://www.apache.org/licenses/LICENSE-2.0 9a89371c6f144b9049efe7689105feee2c4a38384Jason Sams * 10a89371c6f144b9049efe7689105feee2c4a38384Jason Sams * Unless required by applicable law or agreed to in writing, software 11a89371c6f144b9049efe7689105feee2c4a38384Jason Sams * distributed under the License is distributed on an "AS IS" BASIS, 12a89371c6f144b9049efe7689105feee2c4a38384Jason Sams * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13a89371c6f144b9049efe7689105feee2c4a38384Jason Sams * See the License for the specific language governing permissions and 14a89371c6f144b9049efe7689105feee2c4a38384Jason Sams * limitations under the License. 15a89371c6f144b9049efe7689105feee2c4a38384Jason Sams */ 16a89371c6f144b9049efe7689105feee2c4a38384Jason Sams 17a89371c6f144b9049efe7689105feee2c4a38384Jason Sams#ifndef ANDROID_RS_BUILD_FOR_HOST 184edf030cbb7c6ac08dc563335c2af73c20f6e2e5Alex Sakhartchouk#include "rsContext.h" 19e23d239828a229eb7d4d33c9630070f0a87833e1Alex Sakhartchouk#else 20fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk#include "rsContextHostStub.h" 21fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk#endif //ANDROID_RS_BUILD_FOR_HOST 22fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 23a89371c6f144b9049efe7689105feee2c4a38384Jason Sams#include "rsAnimation.h" 24afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk 25a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk 26a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchoukusing namespace android; 27a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchoukusing namespace android::renderscript; 28064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex Sakhartchouk 29064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex Sakhartchoukvoid Animation::serialize(OStream *stream) const 30a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk{ 31a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk 32a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk} 33064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex Sakhartchouk 34064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex SakhartchoukAnimation *Animation::createFromStream(Context *rsc, IStream *stream) 35064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex Sakhartchouk{ 36a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk return NULL; 3754929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk} 38a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk 39a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk/* 40a04e30dbb5ab11592b03666bb3d102070759c58eAlex SakhartchoukAnimation::Animation(Context *rsc) : ObjectBase(rsc) 41a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk{ 42a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk mAllocFile = __FILE__; 43064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex Sakhartchouk mAllocLine = __LINE__; 44064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex Sakhartchouk 45064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex Sakhartchouk mValuesInput = NULL; 46a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk mValuesOutput = NULL; 47064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex Sakhartchouk mValueCount = 0; 48064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex Sakhartchouk mInterpolation = RS_ANIMATION_INTERPOLATION_STEP; 49064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex Sakhartchouk mEdgePre = RS_ANIMATION_EDGE_UNDEFINED; 50064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex Sakhartchouk mEdgePost = RS_ANIMATION_EDGE_UNDEFINED; 51a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk mInputMin = 0; 52a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk mInputMax = 0; 53064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex Sakhartchouk} 54064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex Sakhartchouk 55064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex SakhartchoukAnimation * Animation::create(Context *rsc, 56064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex Sakhartchouk const float *inValues, const float *outValues, 57064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex Sakhartchouk uint32_t valueCount, RsAnimationInterpolation interp, 58064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex Sakhartchouk RsAnimationEdge pre, RsAnimationEdge post) 59064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex Sakhartchouk{ 60a89371c6f144b9049efe7689105feee2c4a38384Jason Sams if (valueCount < 2) { 61a89371c6f144b9049efe7689105feee2c4a38384Jason Sams rsc->setError(RS_ERROR_BAD_VALUE, "Animations require more than 2 values."); 62afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk return NULL; 63a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk } 64a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk Animation *a = new Animation(rsc); 65a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk if (!a) { 66a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk rsc->setError(RS_ERROR_OUT_OF_MEMORY); 67064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex Sakhartchouk return NULL; 68064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex Sakhartchouk } 69064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex Sakhartchouk 704e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk float *vin = (float *)malloc(valueCount * sizeof(float)); 71064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex Sakhartchouk float *vout = (float *)malloc(valueCount * sizeof(float)); 72064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex Sakhartchouk a->mValuesInput = vin; 73a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk a->mValuesOutput = vout; 7454929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk if (a->mValuesInput == NULL || a->mValuesOutput == NULL) { 75a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk delete a; 7677d9f4bd05b2d2a161f30c12a2248f9c97eaac42Alex Sakhartchouk rsc->setError(RS_ERROR_OUT_OF_MEMORY); 77a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk return NULL; 78099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk } 79099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk 80099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk a->mEdgePre = pre; 81e3150cfb3edb028407669e4a65e087eae77e718cJason Sams a->mEdgePost = post; 82099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk a->mInterpolation = interp; 83099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk a->mValueCount = valueCount; 8448ecf6a5e85a9a832f41393ed2802385bb8b5db8Jason Sams 85099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk memcpy(vin, inValues, valueCount * sizeof(float)); 86099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk memcpy(vout, outValues, valueCount * sizeof(float)); 87a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk a->mInputMin = inValues[0]; 88a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk a->mInputMax = inValues[0]; 89e3150cfb3edb028407669e4a65e087eae77e718cJason Sams 90099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk bool needSort = false; 91099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk for (uint32_t ct=1; ct < valueCount; ct++) { 92a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk if (a->mInputMin > vin[ct]) { 93099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk needSort = true; 94a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk a->mInputMin = vin[ct]; 95064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex Sakhartchouk } 96099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk if (a->mInputMax < vin[ct]) { 97064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex Sakhartchouk a->mInputMax = vin[ct]; 98099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk } else { 99e3150cfb3edb028407669e4a65e087eae77e718cJason Sams needSort = true; 100099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk } 101099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk } 102099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk 103099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk while (1) { 104099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk bool changed = false; 105099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk for (uint32_t ct=1; ct < valueCount; ct++) { 106099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk if (vin[ct-1] > vin[ct]) { 107099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk float t = vin[ct-1]; 108099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk vin[ct-1] = vin[ct]; 109099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk vin[ct] = t; 110af12ac6a08651464f8d823add667c706f993b587Steve Block t = vout[ct-1]; 111099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk vout[ct-1] = vout[ct]; 112099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk vout[ct] = t; 113099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk changed = true; 11448ecf6a5e85a9a832f41393ed2802385bb8b5db8Jason Sams } 115099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk } 116a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk if (!changed) break; 117a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk } 118a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk 119a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk return a; 120099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk} 121a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk*/ 122099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk 123a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk 124099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk///////////////////////////////////////// 125099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk// 126099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk 127a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouknamespace android { 128a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouknamespace renderscript { 129a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk 130a04e30dbb5ab11592b03666bb3d102070759c58eAlex SakhartchoukRsAnimation rsi_AnimationCreate(Context *rsc, 131a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk const float *inValues, 132a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk const float *outValues, 133099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk uint32_t valueCount, 134099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk RsAnimationInterpolation interp, 135a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk RsAnimationEdge pre, 136a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk RsAnimationEdge post) 137099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk{ 138099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk //LOGE("rsi_ElementCreate %i %i %i %i", dt, dk, norm, vecSize); 139099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk Animation *a = NULL;//Animation::create(rsc, inValues, outValues, valueCount, interp, pre, post); 140099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk if (a != NULL) { 141099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk a->incUserRef(); 142a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk } 143099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk return (RsAnimation)a; 144099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk} 145099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk 146099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk 147a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk} 14848ecf6a5e85a9a832f41393ed2802385bb8b5db8Jason Sams} 149a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk 150a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk