115a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root/* 215a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root * Copyright (C) 2006 The Android Open Source Project 315a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root * 415a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root * Licensed under the Apache License, Version 2.0 (the "License"); 515a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root * you may not use this file except in compliance with the License. 615a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root * You may obtain a copy of the License at 715a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root * 815a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root * http://www.apache.org/licenses/LICENSE-2.0 915a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root * 1015a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root * Unless required by applicable law or agreed to in writing, software 1115a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root * distributed under the License is distributed on an "AS IS" BASIS, 1215a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1315a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root * See the License for the specific language governing permissions and 1415a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root * limitations under the License. 1515a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root */ 161c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich 171c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevichimport java.util.ArrayList; 181c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevichimport java.util.List; 191c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich 201c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevichpublic class JFunc { 211c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich 221c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich String className = "com.google.android.gles_jni.GL11Impl"; 231c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich 241c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich CFunc cfunc; 251c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich JType ftype; 261c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich String fname; 271c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich 281c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich List<String> argNames = new ArrayList<String>(); 291c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich List<JType> argTypes = new ArrayList<JType>(); 301c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich List<Integer> argCIndices = new ArrayList<Integer>(); 311c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich 321c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich boolean hasBufferArg = false; 331c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich boolean hasTypedBufferArg = false; 341c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich ArrayList<String> bufferArgNames = new ArrayList<String>(); 351c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich 361c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich public JFunc(CFunc cfunc) { 371c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich this.cfunc = cfunc; 381c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich } 391c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich 401c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich public CFunc getCFunc() { 411c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich return cfunc; 421c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich } 431c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich 441c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich public void setName(String fname) { 451c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich this.fname = fname; 461c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich } 471c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich 481c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich public String getName() { 491c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich return fname; 501c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich } 511c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich 521c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich public void setType(JType ftype) { 531c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich this.ftype = ftype; 541c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich } 551c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich 561c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich public JType getType() { 571c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich return ftype; 581c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich } 591c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich 601c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich public void setClassName(String className) { 611c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich this.className = className; 621c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich } 631c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich 641c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich public String getClassName() { 651c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich return className; 661c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich } 671c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich 681c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich public boolean hasBufferArg() { 691c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich return hasBufferArg; 701c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich } 711c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich 721c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich public boolean hasTypedBufferArg() { 731c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich return hasTypedBufferArg; 741c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich } 751c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich 761c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich public String getBufferArgName(int index) { 771c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich return bufferArgNames.get(index); 781c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich } 791c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich 801c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich public void addArgument(String argName, JType argType, int cindex) { 811c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich argNames.add(argName); 821c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich argTypes.add(argType); 831c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich argCIndices.add(new Integer(cindex)); 841c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich 851c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich if (argType.isBuffer()) { 861c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich hasBufferArg = true; 871c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich bufferArgNames.add(argName); 881c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich } 891c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich if (argType.isTypedBuffer()) { 901c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich hasTypedBufferArg = true; 911c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich bufferArgNames.add(argName); 921c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich } 931c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich } 941c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich 951c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich public int getNumArgs() { 961c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich return argNames.size(); 971c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich } 981c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich 991c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich public int getArgIndex(String name) { 1001c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich int len = argNames.size(); 1011c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich for (int i = 0; i < len; i++) { 1021c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich if (name.equals(argNames.get(i))) { 1031c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich return i; 1041c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich } 1051c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich } 1061c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich return -1; 1071c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich } 1081c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich 1091c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich public String getArgName(int index) { 1101c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich return argNames.get(index); 1111c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich } 1121c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich 1131c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich public JType getArgType(int index) { 1141c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich return argTypes.get(index); 1151c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich } 1161c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich 1171c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich public int getArgCIndex(int index) { 1181c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich return argCIndices.get(index).intValue(); 1191c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich } 1201c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich 1211c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich public static JFunc convert(CFunc cfunc, boolean useArray) { 1221c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich try { 1231c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich JFunc jfunc = new JFunc(cfunc); 1241c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich jfunc.setName(cfunc.getName()); 1251c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich jfunc.setType(JType.convert(cfunc.getType(), false)); 1261c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich 1271c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich int numArgs = cfunc.getNumArgs(); 1281c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich int numOffsets = 0; 1291c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich for (int i = 0; i < numArgs; i++) { 1301c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich CType cArgType = cfunc.getArgType(i); 1311c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich if (cArgType.isTypedPointer() && useArray) { 1321c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich ++numOffsets; 1331c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich } 1341c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich } 1351c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich 1361c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich for (int i = 0; i < numArgs; i++) { 1371c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich String cArgName = cfunc.getArgName(i); 1381c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich CType cArgType = cfunc.getArgType(i); 1391c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich 1401c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich jfunc.addArgument(cArgName, JType.convert(cArgType, useArray), i); 1411c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich if (cArgType.isTypedPointer() && useArray) { 1421c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich if (numOffsets > 1) { 1431c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich jfunc.addArgument(cArgName + "Offset", new JType("int"), i); 1441c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich } else { 1451c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich jfunc.addArgument("offset", new JType("int"), i); 1461c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich } 1471c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich } 1481c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich } 1491c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich 1501c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich return jfunc; 1511c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich } catch (RuntimeException e) { 1521c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich System.err.println("Failed to convert function " + cfunc); 1531c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich throw e; 1541c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich } 1551c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich } 1561c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich 1571c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich @Override 1581c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich public String toString() { 1591c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich String s = "Function " + fname + " returns " + ftype + ": "; 1601c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich for (int i = 0; i < argNames.size(); i++) { 1611c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich if (i > 0) { 1621c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich s += ", "; 1631c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich } 1641c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich s += argTypes.get(i) + " " + argNames.get(i); 1651c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich } 1661c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich return s; 1671c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich } 1681c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich 1691c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich} 170