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.HashMap;
181c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich
191c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevichpublic class JType {
201c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich
211c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich    String baseType;
221c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich    boolean isArray;
231c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich    boolean isClass;
24560814f6b11abe83ff0c4ed18cac015c276b3181Jack Palevich    boolean isString;
251c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich
261c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich    static HashMap<CType,JType> typeMapping = new HashMap<CType,JType>();
271c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich    static HashMap<CType,JType> arrayTypeMapping = new HashMap<CType,JType>();
281c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich
291c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich    static {
301c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich    // Primitive types
311c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich    typeMapping.put(new CType("GLbitfield"), new JType("int"));
321c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich    typeMapping.put(new CType("GLboolean"), new JType("boolean"));
331c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich    typeMapping.put(new CType("GLclampf"), new JType("float"));
341c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich    typeMapping.put(new CType("GLclampx"), new JType("int"));
351c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich    typeMapping.put(new CType("GLenum"), new JType("int"));
361c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich    typeMapping.put(new CType("GLfloat"), new JType("float"));
371c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich    typeMapping.put(new CType("GLfixed"), new JType("int"));
381c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich    typeMapping.put(new CType("GLint"), new JType("int"));
391c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich    typeMapping.put(new CType("GLintptr"), new JType("int"));
401c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich    typeMapping.put(new CType("GLshort"), new JType("short"));
411c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich    typeMapping.put(new CType("GLsizei"), new JType("int"));
421c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich    typeMapping.put(new CType("GLsizeiptr"), new JType("int"));
431c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich    typeMapping.put(new CType("GLubyte"), new JType("byte"));
441c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich    typeMapping.put(new CType("GLuint"), new JType("int"));
451c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich    typeMapping.put(new CType("void"), new JType("void"));
46560814f6b11abe83ff0c4ed18cac015c276b3181Jack Palevich    typeMapping.put(new CType("GLubyte", true, true), new JType("String", false, false));
47560814f6b11abe83ff0c4ed18cac015c276b3181Jack Palevich    typeMapping.put(new CType("char", false, true), new JType("byte"));
48560814f6b11abe83ff0c4ed18cac015c276b3181Jack Palevich    typeMapping.put(new CType("char", true, true), new JType("String", false, false));
49560814f6b11abe83ff0c4ed18cac015c276b3181Jack Palevich    typeMapping.put(new CType("int"), new JType("int"));
501c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich
511c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich    // Untyped pointers map to untyped Buffers
521c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich    typeMapping.put(new CType("GLvoid", true, true),
531c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich            new JType("java.nio.Buffer", true, false));
541c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich    typeMapping.put(new CType("GLvoid", false, true),
551c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich            new JType("java.nio.Buffer", true, false));
561c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich    typeMapping.put(new CType("void", false, true),
571c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich            new JType("java.nio.Buffer", true, false));
581c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich    typeMapping.put(new CType("GLeglImageOES", false, false),
591c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich            new JType("java.nio.Buffer", true, false));
601c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich
611c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich    // Typed pointers map to typed Buffers
621c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich    typeMapping.put(new CType("GLboolean", false, true),
631c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich            new JType("java.nio.IntBuffer", true, false));
64560814f6b11abe83ff0c4ed18cac015c276b3181Jack Palevich    typeMapping.put(new CType("GLenum", false, true),
65560814f6b11abe83ff0c4ed18cac015c276b3181Jack Palevich            new JType("java.nio.IntBuffer", true, false));
661c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich    typeMapping.put(new CType("GLfixed", false, true),
671c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich            new JType("java.nio.IntBuffer", true, false));
681c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich    typeMapping.put(new CType("GLfixed", true, true),
691c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich            new JType("java.nio.IntBuffer", true, false));
701c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich    typeMapping.put(new CType("GLfloat", false, true),
711c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich            new JType("java.nio.FloatBuffer", true, false));
721c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich    typeMapping.put(new CType("GLfloat", true, true),
731c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich            new JType("java.nio.FloatBuffer", true, false));
741c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich    typeMapping.put(new CType("GLint", false, true),
751c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich            new JType("java.nio.IntBuffer", true, false));
761c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich    typeMapping.put(new CType("GLint", true, true),
771c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich            new JType("java.nio.IntBuffer", true, false));
78560814f6b11abe83ff0c4ed18cac015c276b3181Jack Palevich    typeMapping.put(new CType("GLsizei", false, true),
79560814f6b11abe83ff0c4ed18cac015c276b3181Jack Palevich            new JType("java.nio.IntBuffer", true, false));
801c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich    typeMapping.put(new CType("GLuint", false, true),
811c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich            new JType("java.nio.IntBuffer", true, false));
821c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich    typeMapping.put(new CType("GLuint", true, true),
831c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich            new JType("java.nio.IntBuffer", true, false));
841c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich    typeMapping.put(new CType("GLshort", true, true),
851c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich            new JType("java.nio.ShortBuffer", true, false));
861c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich
871c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich    // Typed pointers map to arrays + offsets
88560814f6b11abe83ff0c4ed18cac015c276b3181Jack Palevich    arrayTypeMapping.put(new CType("char", false, true),
89560814f6b11abe83ff0c4ed18cac015c276b3181Jack Palevich            new JType("byte", false, true));
901c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich    arrayTypeMapping.put(new CType("GLboolean", false, true),
911c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich                 new JType("boolean", false, true));
92560814f6b11abe83ff0c4ed18cac015c276b3181Jack Palevich    arrayTypeMapping.put(new CType("GLenum", false, true), new JType("int", false, true));
931c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich    arrayTypeMapping.put(new CType("GLfixed", true, true), new JType("int", false, true));
941c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich    arrayTypeMapping.put(new CType("GLfixed", false, true), new JType("int", false, true));
951c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich    arrayTypeMapping.put(new CType("GLfloat", false, true), new JType("float", false, true));
961c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich    arrayTypeMapping.put(new CType("GLfloat", true, true), new JType("float", false, true));
971c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich    arrayTypeMapping.put(new CType("GLint", false, true), new JType("int", false, true));
981c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich    arrayTypeMapping.put(new CType("GLint", true, true), new JType("int", false, true));
991c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich    arrayTypeMapping.put(new CType("GLshort", true, true), new JType("short", false, true));
100560814f6b11abe83ff0c4ed18cac015c276b3181Jack Palevich    arrayTypeMapping.put(new CType("GLsizei", false, true), new JType("int", false, true));
101560814f6b11abe83ff0c4ed18cac015c276b3181Jack Palevich    arrayTypeMapping.put(new CType("GLsizei", true, true), new JType("int", false, true));
1021c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich    arrayTypeMapping.put(new CType("GLuint", false, true), new JType("int", false, true));
1031c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich    arrayTypeMapping.put(new CType("GLuint", true, true), new JType("int", false, true));
1041c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich    arrayTypeMapping.put(new CType("GLintptr"), new JType("int", false, true));
1051c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich    arrayTypeMapping.put(new CType("GLsizeiptr"), new JType("int", false, true));
1061c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich    }
1071c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich
1081c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich    public JType() {
1091c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich    }
1101c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich
1111c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich    public JType(String primitiveTypeName) {
1121c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich    this.baseType = primitiveTypeName;
1131c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich    this.isClass = false;
1141c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich    this.isArray = false;
1151c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich    }
1161c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich
1171c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich    public JType(String primitiveTypeName, boolean isClass, boolean isArray) {
1181c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich    this.baseType = primitiveTypeName;
1191c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich    this.isClass = isClass;
1201c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich    this.isArray = isArray;
1211c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich    }
1221c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich
1231c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich    public String getBaseType() {
1241c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich    return baseType;
1251c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich    }
1261c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich
1271c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich    @Override
1281c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich    public String toString() {
1291c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich    return baseType + (isArray ? "[]" : "");
1301c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich    }
1311c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich
1321c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich    public boolean isArray() {
1331c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich    return isArray;
1341c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich    }
1351c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich
1361c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich    public boolean isClass() {
1371c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich    return isClass;
1381c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich    }
1391c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich
140560814f6b11abe83ff0c4ed18cac015c276b3181Jack Palevich    public boolean isString() {
141560814f6b11abe83ff0c4ed18cac015c276b3181Jack Palevich        return baseType.equals("String");
142560814f6b11abe83ff0c4ed18cac015c276b3181Jack Palevich    }
143560814f6b11abe83ff0c4ed18cac015c276b3181Jack Palevich
1441c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich    public boolean isPrimitive() {
1451c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich    return !isClass() && !isArray();
1461c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich    }
1471c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich
1481c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich    public boolean isVoid() {
1491c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich    return baseType.equals("void");
1501c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich    }
1511c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich
1521c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich    public boolean isBuffer() {
1531c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich    return baseType.indexOf("Buffer") != -1;
1541c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich    }
1551c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich
1561c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich    public boolean isTypedBuffer() {
1571c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich    return !baseType.equals("java.nio.Buffer") &&
1581c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich        (baseType.indexOf("Buffer") != -1);
1591c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich    }
1601c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich
1611c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich    public static JType convert(CType ctype, boolean useArray) {
1621c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich     JType javaType = null;
1631c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich     if (useArray) {
1641c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich         javaType = arrayTypeMapping.get(ctype);
1651c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich     }
1661c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich     if (javaType == null) {
1671c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich         javaType = typeMapping.get(ctype);
1681c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich     }
1691c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich     if (javaType == null) {
1701c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich         throw new RuntimeException("Unsupported C type: " + ctype);
1711c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich     }
1721c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich     return javaType;
1731c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich    }
1741c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich}
175