From 1df5d25560506aec48851e43e21c841b00a28383 Mon Sep 17 00:00:00 2001 From: Ioannis Tsakpinis Date: Tue, 23 Jul 2013 01:57:41 +0300 Subject: [PATCH] Added support for PointerBuffer parameters to OpenGL. --- .../util/generator/NativeTypeTranslator.java | 5 +-- .../org/lwjgl/util/generator/PointerType.java | 41 +++++++++++++++++++ .../org/lwjgl/util/generator/TypeInfo.java | 10 +++-- .../util/generator/opengl/GLTypeMap.java | 3 ++ .../lwjgl/util/generator/opengl/GLintptr.java | 2 + .../util/generator/opengl/GLintptrARB.java | 2 + .../util/generator/opengl/GLsizeiptr.java | 2 + .../util/generator/opengl/GLsizeiptrARB.java | 2 + 8 files changed, 60 insertions(+), 7 deletions(-) create mode 100644 src/java/org/lwjgl/util/generator/PointerType.java diff --git a/src/java/org/lwjgl/util/generator/NativeTypeTranslator.java b/src/java/org/lwjgl/util/generator/NativeTypeTranslator.java index 0c568ed3..0570ff4f 100644 --- a/src/java/org/lwjgl/util/generator/NativeTypeTranslator.java +++ b/src/java/org/lwjgl/util/generator/NativeTypeTranslator.java @@ -168,12 +168,9 @@ public class NativeTypeTranslator implements TypeVisitor { } else if ( Buffer.class.equals(c) ) { native_types = new ArrayList(); native_types.add(type_map.getVoidType()); - } else if ( Buffer.class.isAssignableFrom(c) ) { + } else if ( Buffer.class.isAssignableFrom(c) || PointerBuffer.class.isAssignableFrom(c) ) { PrimitiveType.Kind kind = getPrimitiveKindFromBufferClass(c); getNativeTypeFromAnnotatedPrimitiveType(kind); - } else if ( PointerBuffer.class.isAssignableFrom(c) ) { - native_types = new ArrayList(); - native_types.add(PointerBuffer.class); } else if ( org.lwjgl.PointerWrapper.class.isAssignableFrom(c) ) { native_types = new ArrayList(); native_types.add(PointerWrapper.class); diff --git a/src/java/org/lwjgl/util/generator/PointerType.java b/src/java/org/lwjgl/util/generator/PointerType.java new file mode 100644 index 00000000..8901185e --- /dev/null +++ b/src/java/org/lwjgl/util/generator/PointerType.java @@ -0,0 +1,41 @@ +/* + * Copyright (c) 2002-2013 LWJGL Project + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.util.generator; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Target; + +/** Marker interface for pointer types. */ +@Target(ElementType.ANNOTATION_TYPE) +public @interface PointerType { + +} \ No newline at end of file diff --git a/src/java/org/lwjgl/util/generator/TypeInfo.java b/src/java/org/lwjgl/util/generator/TypeInfo.java index eccf57db..d2967e48 100644 --- a/src/java/org/lwjgl/util/generator/TypeInfo.java +++ b/src/java/org/lwjgl/util/generator/TypeInfo.java @@ -41,6 +41,7 @@ package org.lwjgl.util.generator; * $Id$ */ +import org.lwjgl.PointerBuffer; import org.lwjgl.util.generator.opengl.GLvoid; import com.sun.mirror.declaration.*; @@ -107,7 +108,7 @@ public class TypeInfo { return type; } - private static Class getBufferTypeFromPrimitiveKind(PrimitiveType.Kind kind) { + private static Class getBufferTypeFromPrimitiveKind(PrimitiveType.Kind kind, AnnotationMirror annotation) { Class type; switch (kind) { case INT: @@ -123,7 +124,10 @@ public class TypeInfo { type = ShortBuffer.class; break; case LONG: - type = LongBuffer.class; + if ( annotation.getAnnotationType().getDeclaration().getAnnotation(PointerType.class) != null ) + type = PointerBuffer.class; + else + type = LongBuffer.class; break; case BYTE: /* fall through */ case BOOLEAN: @@ -178,7 +182,7 @@ public class TypeInfo { GLvoid void_annotation = param.getAnnotation(GLvoid.class); kind = void_annotation == null ? type_map.getPrimitiveTypeFromNativeType(annotation_type) : void_annotation.value(); if (Utils.getNIOBufferType(decl_type) != null) - type = getBufferTypeFromPrimitiveKind(kind); + type = getBufferTypeFromPrimitiveKind(kind, annotation); else type = getTypeFromPrimitiveKind(kind); TypeInfo type_info = new TypeInfo(type, signedness, auto_type); diff --git a/src/java/org/lwjgl/util/generator/opengl/GLTypeMap.java b/src/java/org/lwjgl/util/generator/opengl/GLTypeMap.java index d85a42d2..46797e21 100644 --- a/src/java/org/lwjgl/util/generator/opengl/GLTypeMap.java +++ b/src/java/org/lwjgl/util/generator/opengl/GLTypeMap.java @@ -41,6 +41,7 @@ package org.lwjgl.util.generator.opengl; * $Id: GLTypeMap.java 3392 2010-07-27 15:33:22Z spasi $ */ +import org.lwjgl.PointerBuffer; import org.lwjgl.util.generator.NativeTypeTranslator; import org.lwjgl.util.generator.PointerWrapper; import org.lwjgl.util.generator.Signedness; @@ -274,6 +275,8 @@ public class GLTypeMap implements TypeMap { valid_types = new Class[] { PointerWrapper.class }; else if (void.class.equals(type) ) valid_types = new Class[] { GLreturn.class }; + else if ( PointerBuffer.class.equals(type) ) + valid_types = new Class[] { GLintptr.class, GLintptrARB.class, GLsizeiptr.class, GLsizeiptrARB.class }; else valid_types = new Class[] { }; return valid_types; diff --git a/src/java/org/lwjgl/util/generator/opengl/GLintptr.java b/src/java/org/lwjgl/util/generator/opengl/GLintptr.java index 36155ac1..11da320c 100644 --- a/src/java/org/lwjgl/util/generator/opengl/GLintptr.java +++ b/src/java/org/lwjgl/util/generator/opengl/GLintptr.java @@ -39,11 +39,13 @@ package org.lwjgl.util.generator.opengl; */ import org.lwjgl.util.generator.NativeType; +import org.lwjgl.util.generator.PointerType; import java.lang.annotation.Target; import java.lang.annotation.ElementType; @NativeType +@PointerType @Target({ElementType.PARAMETER, ElementType.METHOD}) public @interface GLintptr { } diff --git a/src/java/org/lwjgl/util/generator/opengl/GLintptrARB.java b/src/java/org/lwjgl/util/generator/opengl/GLintptrARB.java index 5a2e6061..c0b0e60e 100644 --- a/src/java/org/lwjgl/util/generator/opengl/GLintptrARB.java +++ b/src/java/org/lwjgl/util/generator/opengl/GLintptrARB.java @@ -39,11 +39,13 @@ package org.lwjgl.util.generator.opengl; */ import org.lwjgl.util.generator.NativeType; +import org.lwjgl.util.generator.PointerType; import java.lang.annotation.Target; import java.lang.annotation.ElementType; @NativeType +@PointerType @Target({ElementType.PARAMETER, ElementType.METHOD}) public @interface GLintptrARB { } diff --git a/src/java/org/lwjgl/util/generator/opengl/GLsizeiptr.java b/src/java/org/lwjgl/util/generator/opengl/GLsizeiptr.java index bd9353e1..eba3c285 100644 --- a/src/java/org/lwjgl/util/generator/opengl/GLsizeiptr.java +++ b/src/java/org/lwjgl/util/generator/opengl/GLsizeiptr.java @@ -39,11 +39,13 @@ package org.lwjgl.util.generator.opengl; */ import org.lwjgl.util.generator.NativeType; +import org.lwjgl.util.generator.PointerType; import java.lang.annotation.Target; import java.lang.annotation.ElementType; @NativeType +@PointerType @Target({ElementType.PARAMETER, ElementType.METHOD}) public @interface GLsizeiptr { } diff --git a/src/java/org/lwjgl/util/generator/opengl/GLsizeiptrARB.java b/src/java/org/lwjgl/util/generator/opengl/GLsizeiptrARB.java index cca0cdb2..8c56bab2 100644 --- a/src/java/org/lwjgl/util/generator/opengl/GLsizeiptrARB.java +++ b/src/java/org/lwjgl/util/generator/opengl/GLsizeiptrARB.java @@ -39,11 +39,13 @@ package org.lwjgl.util.generator.opengl; */ import org.lwjgl.util.generator.NativeType; +import org.lwjgl.util.generator.PointerType; import java.lang.annotation.Target; import java.lang.annotation.ElementType; @NativeType +@PointerType @Target({ElementType.PARAMETER, ElementType.METHOD}) public @interface GLsizeiptrARB { }