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