rsAnimation.cpp revision fb6b614bcea88a587a7ea4530be45ff0ffa0210e
1a89371c6f144b9049efe7689105feee2c4a38384Jason Sams/*
2a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk * Copyright (C) 2009 The Android Open Source Project
3a89371c6f144b9049efe7689105feee2c4a38384Jason Sams *
4a89371c6f144b9049efe7689105feee2c4a38384Jason Sams * Licensed under the Apache License, Version 2.0 (the "License");
5a89371c6f144b9049efe7689105feee2c4a38384Jason Sams * you may not use this file except in compliance with the License.
6a89371c6f144b9049efe7689105feee2c4a38384Jason Sams * You may obtain a copy of the License at
7a89371c6f144b9049efe7689105feee2c4a38384Jason Sams *
8a89371c6f144b9049efe7689105feee2c4a38384Jason Sams *      http://www.apache.org/licenses/LICENSE-2.0
9a89371c6f144b9049efe7689105feee2c4a38384Jason Sams *
10a89371c6f144b9049efe7689105feee2c4a38384Jason Sams * Unless required by applicable law or agreed to in writing, software
11a89371c6f144b9049efe7689105feee2c4a38384Jason Sams * distributed under the License is distributed on an "AS IS" BASIS,
12a89371c6f144b9049efe7689105feee2c4a38384Jason Sams * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13a89371c6f144b9049efe7689105feee2c4a38384Jason Sams * See the License for the specific language governing permissions and
14a89371c6f144b9049efe7689105feee2c4a38384Jason Sams * limitations under the License.
15a89371c6f144b9049efe7689105feee2c4a38384Jason Sams */
16a89371c6f144b9049efe7689105feee2c4a38384Jason Sams
17a89371c6f144b9049efe7689105feee2c4a38384Jason Sams#ifndef ANDROID_RS_BUILD_FOR_HOST
184edf030cbb7c6ac08dc563335c2af73c20f6e2e5Alex Sakhartchouk#include "rsContext.h"
19e23d239828a229eb7d4d33c9630070f0a87833e1Alex Sakhartchouk#else
20fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk#include "rsContextHostStub.h"
21fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk#endif //ANDROID_RS_BUILD_FOR_HOST
22fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk
23a89371c6f144b9049efe7689105feee2c4a38384Jason Sams#include "rsAnimation.h"
24afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk
25a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk
26a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchoukusing namespace android;
27a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchoukusing namespace android::renderscript;
28064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex Sakhartchouk
29064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex Sakhartchoukvoid Animation::serialize(OStream *stream) const
30a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk{
31a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk
32a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk}
33064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex Sakhartchouk
34064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex SakhartchoukAnimation *Animation::createFromStream(Context *rsc, IStream *stream)
35064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex Sakhartchouk{
36a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk    return NULL;
3754929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk}
38a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk
39a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk/*
40a04e30dbb5ab11592b03666bb3d102070759c58eAlex SakhartchoukAnimation::Animation(Context *rsc) : ObjectBase(rsc)
41a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk{
42a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk    mAllocFile = __FILE__;
43064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex Sakhartchouk    mAllocLine = __LINE__;
44064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex Sakhartchouk
45064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex Sakhartchouk    mValuesInput = NULL;
46a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk    mValuesOutput = NULL;
47064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex Sakhartchouk    mValueCount = 0;
48064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex Sakhartchouk    mInterpolation = RS_ANIMATION_INTERPOLATION_STEP;
49064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex Sakhartchouk    mEdgePre = RS_ANIMATION_EDGE_UNDEFINED;
50064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex Sakhartchouk    mEdgePost = RS_ANIMATION_EDGE_UNDEFINED;
51a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk    mInputMin = 0;
52a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk    mInputMax = 0;
53064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex Sakhartchouk}
54064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex Sakhartchouk
55064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex SakhartchoukAnimation * Animation::create(Context *rsc,
56064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex Sakhartchouk                              const float *inValues, const float *outValues,
57064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex Sakhartchouk                              uint32_t valueCount, RsAnimationInterpolation interp,
58064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex Sakhartchouk                              RsAnimationEdge pre, RsAnimationEdge post)
59064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex Sakhartchouk{
60a89371c6f144b9049efe7689105feee2c4a38384Jason Sams    if (valueCount < 2) {
61a89371c6f144b9049efe7689105feee2c4a38384Jason Sams        rsc->setError(RS_ERROR_BAD_VALUE, "Animations require more than 2 values.");
62afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk        return NULL;
63a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk    }
64a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk    Animation *a = new Animation(rsc);
65a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk    if (!a) {
66a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk        rsc->setError(RS_ERROR_OUT_OF_MEMORY);
67064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex Sakhartchouk        return NULL;
68064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex Sakhartchouk    }
69064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex Sakhartchouk
704e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk    float *vin = (float *)malloc(valueCount * sizeof(float));
71064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex Sakhartchouk    float *vout = (float *)malloc(valueCount * sizeof(float));
72064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex Sakhartchouk    a->mValuesInput = vin;
73a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk    a->mValuesOutput = vout;
7454929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk    if (a->mValuesInput == NULL || a->mValuesOutput == NULL) {
75a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk        delete a;
7677d9f4bd05b2d2a161f30c12a2248f9c97eaac42Alex Sakhartchouk        rsc->setError(RS_ERROR_OUT_OF_MEMORY);
77a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk        return NULL;
78099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk    }
79099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk
80099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk    a->mEdgePre = pre;
81e3150cfb3edb028407669e4a65e087eae77e718cJason Sams    a->mEdgePost = post;
82099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk    a->mInterpolation = interp;
83099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk    a->mValueCount = valueCount;
8448ecf6a5e85a9a832f41393ed2802385bb8b5db8Jason Sams
85099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk    memcpy(vin, inValues, valueCount * sizeof(float));
86099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk    memcpy(vout, outValues, valueCount * sizeof(float));
87a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk    a->mInputMin = inValues[0];
88a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk    a->mInputMax = inValues[0];
89e3150cfb3edb028407669e4a65e087eae77e718cJason Sams
90099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk    bool needSort = false;
91099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk    for (uint32_t ct=1; ct < valueCount; ct++) {
92a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk        if (a->mInputMin > vin[ct]) {
93099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk            needSort = true;
94a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk            a->mInputMin = vin[ct];
95064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex Sakhartchouk        }
96099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk        if (a->mInputMax < vin[ct]) {
97064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex Sakhartchouk            a->mInputMax = vin[ct];
98099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk        } else {
99e3150cfb3edb028407669e4a65e087eae77e718cJason Sams            needSort = true;
100099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk        }
101099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk    }
102099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk
103099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk    while (1) {
104099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk        bool changed = false;
105099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk        for (uint32_t ct=1; ct < valueCount; ct++) {
106099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk            if (vin[ct-1] > vin[ct]) {
107099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk                float t = vin[ct-1];
108099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk                vin[ct-1] = vin[ct];
109099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk                vin[ct] = t;
110af12ac6a08651464f8d823add667c706f993b587Steve Block                t = vout[ct-1];
111099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk                vout[ct-1] = vout[ct];
112099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk                vout[ct] = t;
113099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk                changed = true;
11448ecf6a5e85a9a832f41393ed2802385bb8b5db8Jason Sams            }
115099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk        }
116a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk        if (!changed) break;
117a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk    }
118a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk
119a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk    return a;
120099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk}
121a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk*/
122099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk
123a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk
124099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk/////////////////////////////////////////
125099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk//
126099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk
127a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouknamespace android {
128a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouknamespace renderscript {
129a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk
130a04e30dbb5ab11592b03666bb3d102070759c58eAlex SakhartchoukRsAnimation rsi_AnimationCreate(Context *rsc,
131a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk                                const float *inValues,
132a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk                                const float *outValues,
133099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk                                uint32_t valueCount,
134099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk                                RsAnimationInterpolation interp,
135a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk                                RsAnimationEdge pre,
136a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk                                RsAnimationEdge post)
137099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk{
138099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk    //LOGE("rsi_ElementCreate %i %i %i %i", dt, dk, norm, vecSize);
139099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk    Animation *a = NULL;//Animation::create(rsc, inValues, outValues, valueCount, interp, pre, post);
140099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk    if (a != NULL) {
141099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk        a->incUserRef();
142a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk    }
143099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk    return (RsAnimation)a;
144099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk}
145099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk
146099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk
147a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk}
14848ecf6a5e85a9a832f41393ed2802385bb8b5db8Jason Sams}
149a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk
150a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk