/* * Copyright (C) 2011 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.state.GLCompositeProperty; import com.android.ide.eclipse.gltrace.state.GLListProperty; import com.android.ide.eclipse.gltrace.state.GLSparseArrayProperty; import com.android.ide.eclipse.gltrace.state.GLStateType; import com.android.ide.eclipse.gltrace.state.IGLProperty; import java.util.ArrayList; import java.util.List; /** * GLPropertyAccessor's can be used to extract a certain property from the provided * OpenGL State hierarchy. */ public class GLPropertyAccessor implements IGLPropertyAccessor { private final int mContextId; private final List<GLPropertyExtractor> mExtractors; private GLPropertyAccessor(int contextId, List<GLPropertyExtractor> extractors) { mContextId = contextId; mExtractors = extractors; } @Override public IGLProperty getProperty(IGLProperty state) { IGLProperty root = ((GLListProperty) state).get(mContextId); for (GLPropertyExtractor e : mExtractors) { IGLProperty successor = e.getProperty(root); if (successor == null) { root = null; break; } root = successor; } return root; } /** * Factory method used to construct a {@link GLPropertyAccessor}. * @param contextId id of affected context * @param accessors list of accessor's to be used to navigate the property hierarchy. The * accessors are either Integers or {@link GLStateType} objects. Integers * are assumed to be indexes in a {@link GLListProperty} or * {@link GLSparseArrayProperty}, and the GLStateType enum objects are * used to query {@link GLCompositeProperty}'s. */ public static IGLPropertyAccessor makeAccessor(int contextId, Object...accessors) { List<GLPropertyExtractor> extractors = new ArrayList<GLPropertyExtractor>(); for (Object accessor : accessors) { if (accessor instanceof GLStateType) { extractors.add(new GLNamePropertyExtractor((GLStateType) accessor)); } else if (accessor instanceof Integer) { extractors.add(new GLIndexPropertyExtractor((Integer) accessor)); } else { throw new IllegalArgumentException("Unknown property (" + accessor + ") used to access members of IGLProperty"); } } return new GLPropertyAccessor(contextId, extractors); } private interface GLPropertyExtractor { IGLProperty getProperty(IGLProperty p); } /** Extract properties by name. */ private static class GLNamePropertyExtractor implements GLPropertyExtractor { private final GLStateType mType; public GLNamePropertyExtractor(GLStateType type) { mType = type; } @Override public IGLProperty getProperty(IGLProperty p) { if (p instanceof GLCompositeProperty) { return ((GLCompositeProperty) p).getProperty(mType); } return null; } } /** Extract properties by index. */ private static class GLIndexPropertyExtractor implements GLPropertyExtractor { private final int mIndex; public GLIndexPropertyExtractor(int index) { mIndex = index; } @Override public IGLProperty getProperty(IGLProperty p) { if (p instanceof GLListProperty && mIndex >= 0) { return ((GLListProperty) p).get(mIndex); } if (p instanceof GLSparseArrayProperty) { return ((GLSparseArrayProperty) p).getProperty(mIndex); } return null; } } @Override public String getPath() { StringBuilder sb = new StringBuilder(mExtractors.size() * 10); for (GLPropertyExtractor e: mExtractors) { if (e instanceof GLNamePropertyExtractor) { sb.append(((GLNamePropertyExtractor) e).mType); } else { sb.append(((GLIndexPropertyExtractor) e).mIndex); } sb.append('/'); } return sb.toString(); } }