| /* |
| * Copyright (C) 2009 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| #include "rsContext.h" |
| #include "rsAnimation.h" |
| |
| |
| namespace android { |
| namespace renderscript { |
| |
| void Animation::serialize(Context *rsc, OStream *stream) const { |
| } |
| |
| Animation *Animation::createFromStream(Context *rsc, IStream *stream) { |
| return nullptr; |
| } |
| |
| /* |
| Animation::Animation(Context *rsc) : ObjectBase(rsc) |
| { |
| mAllocFile = __FILE__; |
| mAllocLine = __LINE__; |
| |
| mValuesInput = nullptr; |
| mValuesOutput = nullptr; |
| mValueCount = 0; |
| mInterpolation = RS_ANIMATION_INTERPOLATION_STEP; |
| mEdgePre = RS_ANIMATION_EDGE_UNDEFINED; |
| mEdgePost = RS_ANIMATION_EDGE_UNDEFINED; |
| mInputMin = 0; |
| mInputMax = 0; |
| } |
| |
| Animation * Animation::create(Context *rsc, |
| const float *inValues, const float *outValues, |
| uint32_t valueCount, RsAnimationInterpolation interp, |
| RsAnimationEdge pre, RsAnimationEdge post) |
| { |
| if (valueCount < 2) { |
| rsc->setError(RS_ERROR_BAD_VALUE, "Animations require more than 2 values."); |
| return nullptr; |
| } |
| Animation *a = new Animation(rsc); |
| if (!a) { |
| rsc->setError(RS_ERROR_OUT_OF_MEMORY); |
| return nullptr; |
| } |
| |
| float *vin = (float *)malloc(valueCount * sizeof(float)); |
| float *vout = (float *)malloc(valueCount * sizeof(float)); |
| a->mValuesInput = vin; |
| a->mValuesOutput = vout; |
| if (a->mValuesInput == nullptr || a->mValuesOutput == nullptr) { |
| delete a; |
| rsc->setError(RS_ERROR_OUT_OF_MEMORY); |
| return nullptr; |
| } |
| |
| a->mEdgePre = pre; |
| a->mEdgePost = post; |
| a->mInterpolation = interp; |
| a->mValueCount = valueCount; |
| |
| memcpy(vin, inValues, valueCount * sizeof(float)); |
| memcpy(vout, outValues, valueCount * sizeof(float)); |
| a->mInputMin = inValues[0]; |
| a->mInputMax = inValues[0]; |
| |
| bool needSort = false; |
| for (uint32_t ct=1; ct < valueCount; ct++) { |
| if (a->mInputMin > vin[ct]) { |
| needSort = true; |
| a->mInputMin = vin[ct]; |
| } |
| if (a->mInputMax < vin[ct]) { |
| a->mInputMax = vin[ct]; |
| } else { |
| needSort = true; |
| } |
| } |
| |
| while (1) { |
| bool changed = false; |
| for (uint32_t ct=1; ct < valueCount; ct++) { |
| if (vin[ct-1] > vin[ct]) { |
| float t = vin[ct-1]; |
| vin[ct-1] = vin[ct]; |
| vin[ct] = t; |
| t = vout[ct-1]; |
| vout[ct-1] = vout[ct]; |
| vout[ct] = t; |
| changed = true; |
| } |
| } |
| if (!changed) break; |
| } |
| |
| return a; |
| } |
| */ |
| |
| |
| ///////////////////////////////////////// |
| // |
| |
| RsAnimation rsi_AnimationCreate(Context *rsc, |
| const float *inValues, |
| const float *outValues, |
| uint32_t valueCount, |
| RsAnimationInterpolation interp, |
| RsAnimationEdge pre, |
| RsAnimationEdge post) { |
| //ALOGE("rsi_ElementCreate %i %i %i %i", dt, dk, norm, vecSize); |
| Animation *a = nullptr;//Animation::create(rsc, inValues, outValues, valueCount, interp, pre, post); |
| if (a != nullptr) { |
| a->incUserRef(); |
| } |
| return (RsAnimation)a; |
| } |
| } // namespace renderscript |
| } // namespace android |