1bd393b7f39a71a13893aea8b64474b0b07ebe0ddKenny Root/*
2bd393b7f39a71a13893aea8b64474b0b07ebe0ddKenny Root * Copyright (C) 2006 The Android Open Source Project
3bd393b7f39a71a13893aea8b64474b0b07ebe0ddKenny Root *
4bd393b7f39a71a13893aea8b64474b0b07ebe0ddKenny Root * Licensed under the Apache License, Version 2.0 (the "License");
5bd393b7f39a71a13893aea8b64474b0b07ebe0ddKenny Root * you may not use this file except in compliance with the License.
6bd393b7f39a71a13893aea8b64474b0b07ebe0ddKenny Root * You may obtain a copy of the License at
7bd393b7f39a71a13893aea8b64474b0b07ebe0ddKenny Root *
8bd393b7f39a71a13893aea8b64474b0b07ebe0ddKenny Root *      http://www.apache.org/licenses/LICENSE-2.0
9bd393b7f39a71a13893aea8b64474b0b07ebe0ddKenny Root *
10bd393b7f39a71a13893aea8b64474b0b07ebe0ddKenny Root * Unless required by applicable law or agreed to in writing, software
11bd393b7f39a71a13893aea8b64474b0b07ebe0ddKenny Root * distributed under the License is distributed on an "AS IS" BASIS,
12bd393b7f39a71a13893aea8b64474b0b07ebe0ddKenny Root * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13bd393b7f39a71a13893aea8b64474b0b07ebe0ddKenny Root * See the License for the specific language governing permissions and
14bd393b7f39a71a13893aea8b64474b0b07ebe0ddKenny Root * limitations under the License.
15bd393b7f39a71a13893aea8b64474b0b07ebe0ddKenny Root */
16412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich
17412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevichimport java.util.ArrayList;
18412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevichimport java.util.List;
19412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich
20412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevichpublic class JFunc {
21412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich
22412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich    String className = "com.google.android.gles_jni.GL11Impl";
23412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich
24412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich    CFunc cfunc;
25412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich    JType ftype;
26412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich    String fname;
27412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich
28412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich    List<String> argNames = new ArrayList<String>();
29412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich    List<JType> argTypes = new ArrayList<JType>();
30412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich    List<Integer> argCIndices = new ArrayList<Integer>();
31412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich
32412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich    boolean hasBufferArg = false;
33412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich    boolean hasTypedBufferArg = false;
34412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich    ArrayList<String> bufferArgNames = new ArrayList<String>();
35412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich
36412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich    public JFunc(CFunc cfunc) {
37412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich        this.cfunc = cfunc;
38412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich    }
39412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich
40412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich    public CFunc getCFunc() {
41412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich        return cfunc;
42412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich    }
43412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich
44412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich    public void setName(String fname) {
45412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich        this.fname = fname;
46412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich    }
47412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich
48412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich    public String getName() {
49412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich        return fname;
50412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich    }
51412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich
52412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich    public void setType(JType ftype) {
53412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich        this.ftype = ftype;
54412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich    }
55412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich
56412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich    public JType getType() {
57412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich        return ftype;
58412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich    }
59412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich
60412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich    public void setClassName(String className) {
61412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich        this.className = className;
62412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich    }
63412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich
64412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich    public String getClassName() {
65412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich        return className;
66412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich    }
67412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich
68412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich    public boolean hasBufferArg() {
69412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich        return hasBufferArg;
70412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich    }
71412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich
72412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich    public boolean hasTypedBufferArg() {
73412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich        return hasTypedBufferArg;
74412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich    }
75412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich
76412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich    public String getBufferArgName(int index) {
77412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich        return bufferArgNames.get(index);
78412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich    }
79412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich
80412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich    public void addArgument(String argName, JType argType, int cindex) {
81412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich        argNames.add(argName);
82412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich        argTypes.add(argType);
83412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich        argCIndices.add(new Integer(cindex));
84412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich
85412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich        if (argType.isBuffer()) {
86412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich            hasBufferArg = true;
87412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich            bufferArgNames.add(argName);
88412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich        }
89412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich        if (argType.isTypedBuffer()) {
90412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich            hasTypedBufferArg = true;
91412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich            bufferArgNames.add(argName);
92412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich        }
93412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich    }
94412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich
95412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich    public int getNumArgs() {
96412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich        return argNames.size();
97412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich    }
98412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich
99412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich    public int getArgIndex(String name) {
100412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich        int len = argNames.size();
101412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich        for (int i = 0; i < len; i++) {
102412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich            if (name.equals(argNames.get(i))) {
103412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich                return i;
104412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich            }
105412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich        }
106412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich        return -1;
107412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich    }
108412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich
109412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich    public String getArgName(int index) {
110412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich        return argNames.get(index);
111412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich    }
112412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich
113412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich    public JType getArgType(int index) {
114412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich        return argTypes.get(index);
115412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich    }
116412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich
117412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich    public int getArgCIndex(int index) {
118412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich        return argCIndices.get(index).intValue();
119412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich    }
120412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich
121412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich    public static JFunc convert(CFunc cfunc, boolean useArray) {
122412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich        try {
123412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich            JFunc jfunc = new JFunc(cfunc);
124412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich            jfunc.setName(cfunc.getName());
125412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich            jfunc.setType(JType.convert(cfunc.getType(), false));
126412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich
127412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich            int numArgs = cfunc.getNumArgs();
128412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich            int numOffsets = 0;
129412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich            for (int i = 0; i < numArgs; i++) {
130412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich                CType cArgType = cfunc.getArgType(i);
131412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich                if (cArgType.isTypedPointer() && useArray) {
132412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich                    ++numOffsets;
133412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich                }
134412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich            }
135412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich
136412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich            for (int i = 0; i < numArgs; i++) {
137412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich                String cArgName = cfunc.getArgName(i);
138412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich                CType cArgType = cfunc.getArgType(i);
139412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich
140412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich                jfunc.addArgument(cArgName, JType.convert(cArgType, useArray), i);
141412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich                if (cArgType.isTypedPointer() && useArray) {
142412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich                    if (numOffsets > 1) {
143412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich                        jfunc.addArgument(cArgName + "Offset", new JType("int"), i);
144412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich                    } else {
145412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich                        jfunc.addArgument("offset", new JType("int"), i);
146412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich                    }
147412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich                }
148412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich            }
149412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich
150412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich            return jfunc;
151412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich        } catch (RuntimeException e) {
152412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich            System.err.println("Failed to convert function " + cfunc);
153412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich            throw e;
154412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich        }
155412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich    }
156412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich
157412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich    @Override
158412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich    public String toString() {
159412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich        String s =  "Function " + fname + " returns " + ftype + ": ";
160412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich        for (int i = 0; i < argNames.size(); i++) {
161412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich            if (i > 0) {
162412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich                s += ", ";
163412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich            }
164412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich            s += argTypes.get(i) + " " + argNames.get(i);
165412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich        }
166412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich        return s;
167412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich    }
168412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich
169412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich}
170