/* * Copyright (C) 2012 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. */ package com.android.ide.eclipse.gltrace.state.transforms; import com.android.ide.eclipse.gltrace.GLProtoBuf.GLMessage.Function; import com.android.ide.eclipse.gltrace.state.IGLProperty; import java.nio.ByteBuffer; /** * A {@link BufferSubDataTransform} updates a portion of the buffer data as specified by * the {@link Function#glBufferSubData} function. */ public class BufferSubDataTransform implements IStateTransform { private final IGLPropertyAccessor mAccessor; private final int mOffset; private final byte[] mSubData; private byte[] mOldData; private byte[] mNewData; public BufferSubDataTransform(IGLPropertyAccessor accessor, int offset, byte[] data) { mAccessor = accessor; mOffset = offset; mSubData = data; } @Override public void apply(IGLProperty state) { IGLProperty property = mAccessor.getProperty(state); mOldData = (byte[]) property.getValue(); if (mOldData != null) { mNewData = new byte[mOldData.length]; ByteBuffer bb = ByteBuffer.wrap(mNewData); // copy all of the old buffer bb.put(mOldData); bb.rewind(); // update with the sub buffer data at specified offset bb.position(mOffset); bb.put(mSubData); } property.setValue(mNewData); } @Override public void revert(IGLProperty state) { if (mOldData != null) { IGLProperty property = mAccessor.getProperty(state); property.setValue(mOldData); mOldData = null; } } @Override public IGLProperty getChangedProperty(IGLProperty state) { return mAccessor.getProperty(state); } }