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