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