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