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