blob: 63c045b21e8f92f2979e117a6b5839c312e61daa [file] [log] [blame]
Jack Palevich412f38f22009-04-13 16:22:25 -07001
2import java.util.ArrayList;
3import java.util.List;
4
5public class JFunc {
6
7 String className = "com.google.android.gles_jni.GL11Impl";
8
9 CFunc cfunc;
10 JType ftype;
11 String fname;
12
13 List<String> argNames = new ArrayList<String>();
14 List<JType> argTypes = new ArrayList<JType>();
15 List<Integer> argCIndices = new ArrayList<Integer>();
16
17 boolean hasBufferArg = false;
18 boolean hasTypedBufferArg = false;
19 ArrayList<String> bufferArgNames = new ArrayList<String>();
20
21 public JFunc(CFunc cfunc) {
22 this.cfunc = cfunc;
23 }
24
25 public CFunc getCFunc() {
26 return cfunc;
27 }
28
29 public void setName(String fname) {
30 this.fname = fname;
31 }
32
33 public String getName() {
34 return fname;
35 }
36
37 public void setType(JType ftype) {
38 this.ftype = ftype;
39 }
40
41 public JType getType() {
42 return ftype;
43 }
44
45 public void setClassName(String className) {
46 this.className = className;
47 }
48
49 public String getClassName() {
50 return className;
51 }
52
53 public boolean hasBufferArg() {
54 return hasBufferArg;
55 }
56
57 public boolean hasTypedBufferArg() {
58 return hasTypedBufferArg;
59 }
60
61 public String getBufferArgName(int index) {
62 return bufferArgNames.get(index);
63 }
64
65 public void addArgument(String argName, JType argType, int cindex) {
66 argNames.add(argName);
67 argTypes.add(argType);
68 argCIndices.add(new Integer(cindex));
69
70 if (argType.isBuffer()) {
71 hasBufferArg = true;
72 bufferArgNames.add(argName);
73 }
74 if (argType.isTypedBuffer()) {
75 hasTypedBufferArg = true;
76 bufferArgNames.add(argName);
77 }
78 }
79
80 public int getNumArgs() {
81 return argNames.size();
82 }
83
84 public int getArgIndex(String name) {
85 int len = argNames.size();
86 for (int i = 0; i < len; i++) {
87 if (name.equals(argNames.get(i))) {
88 return i;
89 }
90 }
91 return -1;
92 }
93
94 public String getArgName(int index) {
95 return argNames.get(index);
96 }
97
98 public JType getArgType(int index) {
99 return argTypes.get(index);
100 }
101
102 public int getArgCIndex(int index) {
103 return argCIndices.get(index).intValue();
104 }
105
106 public static JFunc convert(CFunc cfunc, boolean useArray) {
107 try {
108 JFunc jfunc = new JFunc(cfunc);
109 jfunc.setName(cfunc.getName());
110 jfunc.setType(JType.convert(cfunc.getType(), false));
111
112 int numArgs = cfunc.getNumArgs();
113 int numOffsets = 0;
114 for (int i = 0; i < numArgs; i++) {
115 CType cArgType = cfunc.getArgType(i);
116 if (cArgType.isTypedPointer() && useArray) {
117 ++numOffsets;
118 }
119 }
120
121 for (int i = 0; i < numArgs; i++) {
122 String cArgName = cfunc.getArgName(i);
123 CType cArgType = cfunc.getArgType(i);
124
125 jfunc.addArgument(cArgName, JType.convert(cArgType, useArray), i);
126 if (cArgType.isTypedPointer() && useArray) {
127 if (numOffsets > 1) {
128 jfunc.addArgument(cArgName + "Offset", new JType("int"), i);
129 } else {
130 jfunc.addArgument("offset", new JType("int"), i);
131 }
132 }
133 }
134
135 return jfunc;
136 } catch (RuntimeException e) {
137 System.err.println("Failed to convert function " + cfunc);
138 throw e;
139 }
140 }
141
142 @Override
143 public String toString() {
144 String s = "Function " + fname + " returns " + ftype + ": ";
145 for (int i = 0; i < argNames.size(); i++) {
146 if (i > 0) {
147 s += ", ";
148 }
149 s += argTypes.get(i) + " " + argNames.get(i);
150 }
151 return s;
152 }
153
154}