aboutsummaryrefslogtreecommitdiffstats
path: root/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/state/transforms/GLPropertyAccessor.java
blob: 8772a72cbeb7a2f06336ace54d5075b96594be20 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
/*
 * 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) {
                return null;
            }
            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) {
                return ((GLListProperty) p).get(mIndex);
            }
            if (p instanceof GLSparseArrayProperty) {
                return ((GLSparseArrayProperty) p).getProperty(mIndex);
            }
            return null;
        }
    }
}