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