blob: be338be19259fd4dace505ca2b40ace9ee7827f5 [file] [log] [blame]
/*
* 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();
}
}