rsAnimation.cpp revision c1ed589021e280cda59a0521cb96b3e9eb629e1b
1c1ed589021e280cda59a0521cb96b3e9eb629e1bJason Sams/* 2c1ed589021e280cda59a0521cb96b3e9eb629e1bJason Sams * Copyright (C) 2009 The Android Open Source Project 3c1ed589021e280cda59a0521cb96b3e9eb629e1bJason Sams * 4c1ed589021e280cda59a0521cb96b3e9eb629e1bJason Sams * Licensed under the Apache License, Version 2.0 (the "License"); 5c1ed589021e280cda59a0521cb96b3e9eb629e1bJason Sams * you may not use this file except in compliance with the License. 6c1ed589021e280cda59a0521cb96b3e9eb629e1bJason Sams * You may obtain a copy of the License at 7c1ed589021e280cda59a0521cb96b3e9eb629e1bJason Sams * 8c1ed589021e280cda59a0521cb96b3e9eb629e1bJason Sams * http://www.apache.org/licenses/LICENSE-2.0 9c1ed589021e280cda59a0521cb96b3e9eb629e1bJason Sams * 10c1ed589021e280cda59a0521cb96b3e9eb629e1bJason Sams * Unless required by applicable law or agreed to in writing, software 11c1ed589021e280cda59a0521cb96b3e9eb629e1bJason Sams * distributed under the License is distributed on an "AS IS" BASIS, 12c1ed589021e280cda59a0521cb96b3e9eb629e1bJason Sams * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13c1ed589021e280cda59a0521cb96b3e9eb629e1bJason Sams * See the License for the specific language governing permissions and 14c1ed589021e280cda59a0521cb96b3e9eb629e1bJason Sams * limitations under the License. 15c1ed589021e280cda59a0521cb96b3e9eb629e1bJason Sams */ 16c1ed589021e280cda59a0521cb96b3e9eb629e1bJason Sams 17c1ed589021e280cda59a0521cb96b3e9eb629e1bJason Sams#include "rsContext.h" 18c1ed589021e280cda59a0521cb96b3e9eb629e1bJason Sams#include "rsAnimation.h" 19c1ed589021e280cda59a0521cb96b3e9eb629e1bJason Sams 20c1ed589021e280cda59a0521cb96b3e9eb629e1bJason Sams 21c1ed589021e280cda59a0521cb96b3e9eb629e1bJason Samsusing namespace android; 22c1ed589021e280cda59a0521cb96b3e9eb629e1bJason Samsusing namespace android::renderscript; 23c1ed589021e280cda59a0521cb96b3e9eb629e1bJason Sams 24c1ed589021e280cda59a0521cb96b3e9eb629e1bJason Sams/* 25c1ed589021e280cda59a0521cb96b3e9eb629e1bJason SamsAnimation::Animation(Context *rsc) : ObjectBase(rsc) 26c1ed589021e280cda59a0521cb96b3e9eb629e1bJason Sams{ 27c1ed589021e280cda59a0521cb96b3e9eb629e1bJason Sams mAllocFile = __FILE__; 28c1ed589021e280cda59a0521cb96b3e9eb629e1bJason Sams mAllocLine = __LINE__; 29c1ed589021e280cda59a0521cb96b3e9eb629e1bJason Sams 30c1ed589021e280cda59a0521cb96b3e9eb629e1bJason Sams mValuesInput = NULL; 31c1ed589021e280cda59a0521cb96b3e9eb629e1bJason Sams mValuesOutput = NULL; 32c1ed589021e280cda59a0521cb96b3e9eb629e1bJason Sams mValueCount = 0; 33c1ed589021e280cda59a0521cb96b3e9eb629e1bJason Sams mInterpolation = RS_ANIMATION_INTERPOLATION_STEP; 34c1ed589021e280cda59a0521cb96b3e9eb629e1bJason Sams mEdgePre = RS_ANIMATION_EDGE_UNDEFINED; 35c1ed589021e280cda59a0521cb96b3e9eb629e1bJason Sams mEdgePost = RS_ANIMATION_EDGE_UNDEFINED; 36c1ed589021e280cda59a0521cb96b3e9eb629e1bJason Sams mInputMin = 0; 37c1ed589021e280cda59a0521cb96b3e9eb629e1bJason Sams mInputMax = 0; 38c1ed589021e280cda59a0521cb96b3e9eb629e1bJason Sams} 39c1ed589021e280cda59a0521cb96b3e9eb629e1bJason Sams 40c1ed589021e280cda59a0521cb96b3e9eb629e1bJason SamsAnimation * Animation::create(Context *rsc, 41c1ed589021e280cda59a0521cb96b3e9eb629e1bJason Sams const float *inValues, const float *outValues, 42c1ed589021e280cda59a0521cb96b3e9eb629e1bJason Sams uint32_t valueCount, RsAnimationInterpolation interp, 43c1ed589021e280cda59a0521cb96b3e9eb629e1bJason Sams RsAnimationEdge pre, RsAnimationEdge post) 44c1ed589021e280cda59a0521cb96b3e9eb629e1bJason Sams{ 45c1ed589021e280cda59a0521cb96b3e9eb629e1bJason Sams if (valueCount < 2) { 46c1ed589021e280cda59a0521cb96b3e9eb629e1bJason Sams rsc->setError(RS_ERROR_BAD_VALUE, "Animations require more than 2 values."); 47c1ed589021e280cda59a0521cb96b3e9eb629e1bJason Sams return NULL; 48c1ed589021e280cda59a0521cb96b3e9eb629e1bJason Sams } 49c1ed589021e280cda59a0521cb96b3e9eb629e1bJason Sams Animation *a = new Animation(rsc); 50c1ed589021e280cda59a0521cb96b3e9eb629e1bJason Sams if (!a) { 51c1ed589021e280cda59a0521cb96b3e9eb629e1bJason Sams rsc->setError(RS_ERROR_OUT_OF_MEMORY); 52c1ed589021e280cda59a0521cb96b3e9eb629e1bJason Sams return NULL; 53c1ed589021e280cda59a0521cb96b3e9eb629e1bJason Sams } 54c1ed589021e280cda59a0521cb96b3e9eb629e1bJason Sams 55c1ed589021e280cda59a0521cb96b3e9eb629e1bJason Sams float *vin = (float *)malloc(valueCount * sizeof(float)); 56c1ed589021e280cda59a0521cb96b3e9eb629e1bJason Sams float *vout = (float *)malloc(valueCount * sizeof(float)); 57c1ed589021e280cda59a0521cb96b3e9eb629e1bJason Sams a->mValuesInput = vin; 58c1ed589021e280cda59a0521cb96b3e9eb629e1bJason Sams a->mValuesOutput = vout; 59c1ed589021e280cda59a0521cb96b3e9eb629e1bJason Sams if (a->mValuesInput == NULL || a->mValuesOutput == NULL) { 60c1ed589021e280cda59a0521cb96b3e9eb629e1bJason Sams delete a; 61c1ed589021e280cda59a0521cb96b3e9eb629e1bJason Sams rsc->setError(RS_ERROR_OUT_OF_MEMORY); 62c1ed589021e280cda59a0521cb96b3e9eb629e1bJason Sams return NULL; 63c1ed589021e280cda59a0521cb96b3e9eb629e1bJason Sams } 64c1ed589021e280cda59a0521cb96b3e9eb629e1bJason Sams 65c1ed589021e280cda59a0521cb96b3e9eb629e1bJason Sams a->mEdgePre = pre; 66c1ed589021e280cda59a0521cb96b3e9eb629e1bJason Sams a->mEdgePost = post; 67c1ed589021e280cda59a0521cb96b3e9eb629e1bJason Sams a->mInterpolation = interp; 68c1ed589021e280cda59a0521cb96b3e9eb629e1bJason Sams a->mValueCount = valueCount; 69c1ed589021e280cda59a0521cb96b3e9eb629e1bJason Sams 70c1ed589021e280cda59a0521cb96b3e9eb629e1bJason Sams memcpy(vin, inValues, valueCount * sizeof(float)); 71c1ed589021e280cda59a0521cb96b3e9eb629e1bJason Sams memcpy(vout, outValues, valueCount * sizeof(float)); 72c1ed589021e280cda59a0521cb96b3e9eb629e1bJason Sams a->mInputMin = inValues[0]; 73c1ed589021e280cda59a0521cb96b3e9eb629e1bJason Sams a->mInputMax = inValues[0]; 74c1ed589021e280cda59a0521cb96b3e9eb629e1bJason Sams 75c1ed589021e280cda59a0521cb96b3e9eb629e1bJason Sams bool needSort = false; 76c1ed589021e280cda59a0521cb96b3e9eb629e1bJason Sams for (uint32_t ct=1; ct < valueCount; ct++) { 77c1ed589021e280cda59a0521cb96b3e9eb629e1bJason Sams if (a->mInputMin > vin[ct]) { 78c1ed589021e280cda59a0521cb96b3e9eb629e1bJason Sams needSort = true; 79c1ed589021e280cda59a0521cb96b3e9eb629e1bJason Sams a->mInputMin = vin[ct]; 80c1ed589021e280cda59a0521cb96b3e9eb629e1bJason Sams } 81c1ed589021e280cda59a0521cb96b3e9eb629e1bJason Sams if (a->mInputMax < vin[ct]) { 82c1ed589021e280cda59a0521cb96b3e9eb629e1bJason Sams a->mInputMax = vin[ct]; 83c1ed589021e280cda59a0521cb96b3e9eb629e1bJason Sams } else { 84c1ed589021e280cda59a0521cb96b3e9eb629e1bJason Sams needSort = true; 85c1ed589021e280cda59a0521cb96b3e9eb629e1bJason Sams } 86c1ed589021e280cda59a0521cb96b3e9eb629e1bJason Sams } 87c1ed589021e280cda59a0521cb96b3e9eb629e1bJason Sams 88c1ed589021e280cda59a0521cb96b3e9eb629e1bJason Sams while (1) { 89c1ed589021e280cda59a0521cb96b3e9eb629e1bJason Sams bool changed = false; 90c1ed589021e280cda59a0521cb96b3e9eb629e1bJason Sams for (uint32_t ct=1; ct < valueCount; ct++) { 91c1ed589021e280cda59a0521cb96b3e9eb629e1bJason Sams if (vin[ct-1] > vin[ct]) { 92c1ed589021e280cda59a0521cb96b3e9eb629e1bJason Sams float t = vin[ct-1]; 93c1ed589021e280cda59a0521cb96b3e9eb629e1bJason Sams vin[ct-1] = vin[ct]; 94c1ed589021e280cda59a0521cb96b3e9eb629e1bJason Sams vin[ct] = t; 95c1ed589021e280cda59a0521cb96b3e9eb629e1bJason Sams t = vout[ct-1]; 96c1ed589021e280cda59a0521cb96b3e9eb629e1bJason Sams vout[ct-1] = vout[ct]; 97c1ed589021e280cda59a0521cb96b3e9eb629e1bJason Sams vout[ct] = t; 98c1ed589021e280cda59a0521cb96b3e9eb629e1bJason Sams changed = true; 99c1ed589021e280cda59a0521cb96b3e9eb629e1bJason Sams } 100c1ed589021e280cda59a0521cb96b3e9eb629e1bJason Sams } 101c1ed589021e280cda59a0521cb96b3e9eb629e1bJason Sams if (!changed) break; 102c1ed589021e280cda59a0521cb96b3e9eb629e1bJason Sams } 103c1ed589021e280cda59a0521cb96b3e9eb629e1bJason Sams 104c1ed589021e280cda59a0521cb96b3e9eb629e1bJason Sams return a; 105c1ed589021e280cda59a0521cb96b3e9eb629e1bJason Sams} 106c1ed589021e280cda59a0521cb96b3e9eb629e1bJason Sams*/ 107c1ed589021e280cda59a0521cb96b3e9eb629e1bJason Sams 108c1ed589021e280cda59a0521cb96b3e9eb629e1bJason Sams 109c1ed589021e280cda59a0521cb96b3e9eb629e1bJason Sams///////////////////////////////////////// 110c1ed589021e280cda59a0521cb96b3e9eb629e1bJason Sams// 111c1ed589021e280cda59a0521cb96b3e9eb629e1bJason Sams 112c1ed589021e280cda59a0521cb96b3e9eb629e1bJason Samsnamespace android { 113c1ed589021e280cda59a0521cb96b3e9eb629e1bJason Samsnamespace renderscript { 114c1ed589021e280cda59a0521cb96b3e9eb629e1bJason Sams 115c1ed589021e280cda59a0521cb96b3e9eb629e1bJason SamsRsAnimation rsi_AnimationCreate(Context *rsc, 116c1ed589021e280cda59a0521cb96b3e9eb629e1bJason Sams const float *inValues, 117c1ed589021e280cda59a0521cb96b3e9eb629e1bJason Sams const float *outValues, 118c1ed589021e280cda59a0521cb96b3e9eb629e1bJason Sams uint32_t valueCount, 119c1ed589021e280cda59a0521cb96b3e9eb629e1bJason Sams RsAnimationInterpolation interp, 120c1ed589021e280cda59a0521cb96b3e9eb629e1bJason Sams RsAnimationEdge pre, 121c1ed589021e280cda59a0521cb96b3e9eb629e1bJason Sams RsAnimationEdge post) 122c1ed589021e280cda59a0521cb96b3e9eb629e1bJason Sams{ 123c1ed589021e280cda59a0521cb96b3e9eb629e1bJason Sams //LOGE("rsi_ElementCreate %i %i %i %i", dt, dk, norm, vecSize); 124c1ed589021e280cda59a0521cb96b3e9eb629e1bJason Sams Animation *a = NULL;//Animation::create(rsc, inValues, outValues, valueCount, interp, pre, post); 125c1ed589021e280cda59a0521cb96b3e9eb629e1bJason Sams if (a != NULL) { 126c1ed589021e280cda59a0521cb96b3e9eb629e1bJason Sams a->incUserRef(); 127c1ed589021e280cda59a0521cb96b3e9eb629e1bJason Sams } 128c1ed589021e280cda59a0521cb96b3e9eb629e1bJason Sams return (RsAnimation)a; 129c1ed589021e280cda59a0521cb96b3e9eb629e1bJason Sams} 130c1ed589021e280cda59a0521cb96b3e9eb629e1bJason Sams 131c1ed589021e280cda59a0521cb96b3e9eb629e1bJason Sams 132c1ed589021e280cda59a0521cb96b3e9eb629e1bJason Sams} 133c1ed589021e280cda59a0521cb96b3e9eb629e1bJason Sams} 134c1ed589021e280cda59a0521cb96b3e9eb629e1bJason Sams 135